我有以下功能齐全的工作代码:
import urllib.request
import zipfile
url = "http://url.com/archive.zip?key=7UCxcuCzFpYeu7tz18JgGZFAAgXQ2sop"
filename = "C:/test/archive.zip"
destinationPath = "C:/test"
urllib.request.urlretrieve(url,filename)
sourceZip = zipfile.ZipFile(filename, 'r')
for name in sourceZip.namelist():
sourceZip.extract(name, destinationPath)
sourceZip.close()
它可以完美地工作几次,但由于从中检索文件的服务器有一些限制,因此一旦达到每日限制,就会出现此错误:
Traceback (most recent call last):
File "script.py", line 11, in <module>
urllib.request.urlretrieve(url,filename)
File "C:\Python32\lib\urllib\request.py", line 150, in urlretrieve
return _urlopener.retrieve(url, filename, reporthook, data)
File "C:\Python32\lib\urllib\request.py", line 1591, in retrieve
block = fp.read(bs)
ValueError: read of closed file
如何更改脚本,使其包含多个url的列表,而不是一个url,并且脚本继续尝试从列表中下载,直到一个成功,然后继续解压缩。我只需要一个成功的下载。
很抱歉对Python很陌生,但我想不出这一点。我假设我必须改变变量,使其看起来像这样:
url = {
"http://url.com/archive.zip?key=7UCxcuCzFpYeu7tz18JgGZFAAgXQ2soe",
"http://url.com/archive.zip?key=7UCxcuCzFpYeu7tz18JgGZFAAgXQ2sod",
"http://url.com/archive.zip?key=7UCxcuCzFpYeu7tz18JgGZFAAgXQ2soc",
"http://url.com/archive.zip?key=7UCxcuCzFpYeu7tz18JgGZFAAgXQ2sob",
"http://url.com/archive.zip?key=7UCxcuCzFpYeu7tz18JgGZFAAgXQ2soa",
}
然后把这条线变成某种循环:
urllib.request.urlretrieve(url,filename)
对于成熟的分布式任务,您可以签出Celery及其重试机制Celery-retry
或者你可以看看Retry-decorator, 示例:
你想把你的网址放在一个列表中,然后在这个列表中循环并尝试每一个。您捕获但忽略它们抛出的异常,并在一个异常成功后中断循环。试试这个:
如果你只想尝试每一次,直到一次成功,那么就停止。
相关问题 更多 >
编程相关推荐