使用Python保存下载的ZIP文件

3 投票
4 回答
15968 浏览
提问于 2025-04-17 09:58

我正在写一个脚本,目的是自动更新已经安装的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()

撰写回答