【问题标题】:Python script only writes partial results to filePython 脚本仅将部分结果写入文件
【发布时间】:2017-03-30 13:12:20
【问题描述】:

我编写了一个小 Python 脚本,用有效的公共代理填充我的 proxychains.conf 文件。对于每个请求,会检索 10 个代理并将其添加到 proxychains.conf 中,此操作会执行 3 次,因此总共添加了 30 个代理。

当我编写脚本并将结果返回到标准输出时,一切都按预期工作 = 检索并返回了 30 个代理。但是,当我添加脚本的文件操作部分时,只有 10 个代理被写入文件。我仍在学习 Python,我尝试重新安排一些东西,但没有成功。我不知道是否:

  1. 我的柜台放错地方了?
  2. 我的文件操作放错地方了?

代码如下:

#!/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-->

那么有没有更有效的方法来实现这一点?

【问题讨论】:

  • 尝试用 open (proxy_file, 'w') as f: 改变 open (proxy_file, 'a') as f:。可能你每次都覆盖文件
  • 如我所见,您从 proxy_file 读取代理列表并将结果写入 same 文件。你覆盖它,所以在第一次迭代之后只剩下 10 行。不管循环运行多少次,它总是 10 行。

标签: python file-io proxy python-requests


【解决方案1】:

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

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

使用w,您写入一个文件,但如果它不为空,您将覆盖内容。
要修复它,您可以通过这种方式使用append 模式:

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

append 不会覆盖文件内容,而是添加新行。

编辑后回答

首先你可以使用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+,您可以读写,打开文件一次。

【讨论】:

  • 您好佐丹奴感谢您的建议。当我实现'a' 时,脚本实际上重写了proxychains.conf 的全部内容,然后只重写了10 个代理服务器。我能够找到一个解决方案,我将添加作为对原始问题的编辑,因为我相信有更好的解决方案。
  • 佐丹奴 - 您的编辑工作完美。何时使用f = open(file, 'r')with open (file, 'r') as f 我仍然有点困惑,感谢您提供有关使用“+”以读/写方式打开文件的提示。另外使用for 语句而不是while 循环。我不确定如何从 json 文件中获取 ip 的每个实例。感谢您的帮助!
  • 很高兴为您提供帮助!要更好地了解何时使用“open”以及何时使用“with”,请阅读 Python 文档。如果您的问题已解决,请将答案标记为已接受,以帮助其他有相同问题的用户。最好的问候
猜你喜欢
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多