我使用的urllib2开放下载一些网页。不幸的是一个页面是一个无限流(一组实况视频帧)和的urllib2不会超时,因为开放调用成功,而“读”电话挂断,直到永远。示例代码:如何使用urllib2打开'无限'jpg?
res = opener.open(encoded, timeout=timeout)
log('opened', url)
contents = res.read()
log('never get here')
避免/消除这些连接的任何提示?
我使用的urllib2开放下载一些网页。不幸的是一个页面是一个无限流(一组实况视频帧)和的urllib2不会超时,因为开放调用成功,而“读”电话挂断,直到永远。示例代码:如何使用urllib2打开'无限'jpg?
res = opener.open(encoded, timeout=timeout)
log('opened', url)
contents = res.read()
log('never get here')
避免/消除这些连接的任何提示?
使用雅各布提到的发电机的方法,我一体的“杀死开关”。
startime = datetime.now()
res = opener.open(url, timeout=timeout)
contents = ''
for item in res:
contents += item
if (datetime.now() - starttime).seconds > timeout:
raise IOError('timeout')
您应该检查标题以检测它是否为多部分,然后删除或读取内容。
您可以将超时的操作作为一个整体,即,你提到的那些行定义的功能。
这听起来像发电机工作!
想象一下,你有一个无限的文本文件...现在叫它test.txt open('test.txt').read()
将挂起机器并最终崩溃,所以为什么不在生成器的这个无限流中产生线路。
def yield_line(file):
with open(file) as inp:
for line in inp:
yield line
现在当初始化yield_line成为一个可迭代对象,因此这将成为法律
out = open('out.txt')
for line in yield_line('test.txt'):
out.write(line.replace('1','2'))
现在考虑一个URL可以以同样的方式作为一个文件进行操作,你可以得到线的线网址
def yield_url(url):
with urllib.urlopen(url) as inp:
for line in inp:
yield line
编辑: 超时例如
out = open('out.txt')
for count, line in enumerate(yield_line('test.txt')):
if count == 444: #timeout value :D
break
out.write(line.replace('1','2'))
这是有帮助的,但我的观点是,我不希望下载一个无限的文件,我想杀死此类下载。但是,我使用您的发电机策略来解决问题。 – muckabout 2010-11-26 11:18:18
当你发现你喜欢的答案,请接受它^^ – 2010-11-26 15:06:57