使用Python保存下载的ZIP文件
我正在写一个脚本,目的是自动更新已经安装的Calibre版本。目前我让它下载最新的便携版。但是我在保存这个压缩文件时遇到了一些问题。现在我的代码是:
import urllib2
import re
import zipfile
#tell the user what is happening
print("Calibre is Updating")
#download the page
url = urllib2.urlopen ( "http://sourceforge.net/projects/calibre/files" ).read()
#determin current version
result = re.search('title="/[0-9.]*/([a-zA-Z\-]*-[0-9\.]*)', url).groups()[0][:-1]
#download file
download = "http://status.calibre-ebook.com/dist/portable/" + result
urllib2.urlopen( download )
#save
output = open('install.zip', 'w')
output.write(zipfile.ZipFile("install.zip", ""))
output.close()
4 个回答
2
如果你只是想从网上下载一个文件,可以使用 urllib.urlretrieve
这个工具:
它的作用是把一个通过网址(URL)表示的网络对象复制到本地文件中……
下面是一个使用 requests
而不是 urllib2
的例子:
import requests, re, urllib
print("Calibre is updating...")
content = requests.get("http://sourceforge.net/projects/calibre/files").content
# determine current version
v = re.search('title="/[0-9.]*/([a-zA-Z\-]*-[0-9\.]*)', content).groups()[0][:-1]
download_url = "http://status.calibre-ebook.com/dist/portable/{0}".format(v)
print("Downloading {0}".format(download_url))
urllib.urlretrieve(download_url, 'install.zip')
# file should be downloaded at this point
3
这里还有一种一行代码的写法:
open('install.zip', 'wb').write(urllib.urlopen('http://status.calibre-ebook.com/dist/portable/' + result).read())
虽然这种写法在内存使用上不是特别高效,但依然可以正常运行。
7
你不需要使用 zipfile.ZipFile
来完成这个任务(而且你现在使用的方式,包括 urllib2.urlopen
,也有一些问题)。相反,你应该先把打开网址的结果保存到一个变量里,然后用 read
方法读取这个结果,再把读取到的内容写入一个 .zip 文件。试试下面的代码:
#download file
download = "http://status.calibre-ebook.com/dist/portable/" + result
request = urllib2.urlopen( download )
#save
output = open("install.zip", "w")
output.write(request.read())
output.close()