我使用的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