Python脚本只将部分结果写入文件

时间:2017-03-30 13:12:20

标签: python file-io proxy python-requests

我有一个小python脚本,我写了用有效的公共代理填充我的proxychains.conf文件。对于每个请求,检索10个代理并将其添加到proxychains.conf中,这样做3次,以便总共添加30个代理。

当我编写脚本并将结果返回到stdout时,一切按预期工作=检索并返回30个代理。但是当我添加脚本的文件操作部分时,只有10个代理被写入文件。我还在学习Python,而且我试图重新排列一些东西,但它没有成功。我无法弄清楚:

  1. 我的柜台在错误的地方?
  2. 我的档案操作在错误的地方?
  3. 以下是代码:

    #!/usr/bin/env python3
    
    import requests
    import sys,os
    
    proxy_file = '/etc/proxychains.conf'
    base_url = 'http://proxy.tekbreak.com/10/json'
    headers = {'user-agent':'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20'}
    
    def fetchprox():
        pf = open(proxy_file, 'r')
        lines = pf.readlines()
        pf.close()
        with open (proxy_file, 'w') as f:
            del lines[69:]
            f.writelines([item for item in lines[:-1]])
            r = requests.get(base_url, headers=headers)
            n = 0
            while n < 10:
                ip = r.json()[n]['ip']
                port = r.json()[n]['port']
                p_type = r.json()[n]['type']
    
             #output to proxychains.conf
                f.writelines(str(p_type + " " + ip + " " + port + "\n"))
                n += 1    
    
    for i in range(0,3):  
        fetchprox()
    

    感谢您的帮助!

    修改 我找到了一个基于佐丹奴答案的解决方案,但我相信它可以更好地实施。似乎多余的是必须访问此文件3次才能写入一些数据。所以这是脚本中已更改的部分:

    <--snip->
    pf = open(proxy_file, 'r')
    lines = pf.readlines()
    pf.close()
    
    f = open (proxy_file, 'w')
    del lines[69:]
    f.writelines([item for item in lines[:-2]])
    f.close()
    
    def fetchprox():
        with open (proxy_file, 'a') as f:
            r = requests.get(base_url, headers=headers)
            n = 0
            while n < 10:
    <--snip-->
    

    那么有更有效的方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:2)

您的脚本是正确的,但正如我在评论中提到的,您会在每个循环中覆盖您的文件。
更详细的说,错误的行如下:

with open (proxy_file, 'w') as f:

使用w,您可以编写一个文件,但如果它不为空,则会覆盖该内容。
要解决此问题,您可以通过以下方式使用append模式:

with open (proxy_file, 'a') as f:

追加不会覆盖文件内容,但会添加新行。

修改后回答

首先,您可以使用with打开文件,因此我也删除了.close(),因为with会自动处理关闭。 我还以这种方式用while循环更改了for循环:

lines = None
with open(proxy_file, 'r') as pf:
    lines = pf.readlines()

with open (proxy_file, 'w') as f:
    del lines[69:]
    f.writelines([item for item in lines[:-2]])

def fetchprox():
    with open (proxy_file, 'a') as f:
        data = requests.get(base_url, headers=headers).json()
        for element in data:
            ip = element['ip']
            port = element['port']
            p_type = element['type']

            #output to proxychains.conf
            f.writelines(str(p_type + " " + ip + " " + port + "\n"))

for i in range(0,3): 
    fetchprox()

第二次修改

如果要删除对文件的一次访问权限,可以这样使用r+模式:

lines = None
with open(proxy_file, 'r+') as pf:
    lines = pf.readlines()
    del lines[69:]
    pf.writelines([item for item in lines[:-2]])
...

使用r+,您可以读取和写入,打开一次文件。