python保持活着的响应对象

时间:2015-01-21 14:38:08

标签: python-2.7 urllib2

from urllib2 import urlopen

response = urlopen(url)
for line in response:
    do_some_job(line)
response.close()

我从一个非常大的网址获取一些数据。 每一行都需要花费很多时间来阅读(每行平均40000000个字符),函数'do_some_job'在时间方面也很昂贵。我的问题是,在执行第二次迭代时,响应正在关闭,异常正在提升并显示< / p>

socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

如果我通过尝试并重新打开新响应对象来处理此问题,我如何跳过第一行并开始从第二行迭代。

2 个答案:

答案 0 :(得分:1)

@ScottHunter在您的解决方案中我们也在读取已经读过的行,我们正在做的只是读取行并跳过它已经读过。

所以我实现的解决方案是 - 使用具有字符限制的readline

一次读取有限字符
from urllib2 import urlopen
response = urlopen(url)
while True:
    line = response.readline(4096)
    if not line:
        break
    do_some_job(line)
response.close()

答案 1 :(得分:0)

最直接的方法是重新打开每一行的网址,阅读(并忽略)已处理的网址:

lines_done = 0
while True:
    response = url open(url)
    lines_skipped = 0
    did_job = False
    for line in response:
        if lines_skipped == lines_done:
            do_some_job(line)
            did_job = True
            break
        lines_skipped += 1
    response.close()
    if did_job:
        lines_done += 1
    else:
        break