如果我有一个URL,当在网络浏览器中提交时会弹出一个保存zip文件的对话框,我该如何在Python中捕获和下载这个zip文件?
答案 0 :(得分:125)
据我所知,正确的做法是:
import requests, zipfile, StringIO
r = requests.get(zip_file_url, stream=True)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
z.extractall()
当然,您希望使用r.ok
检查GET是否成功。
对于python 3+,将StringIO模块与io模块一起使用并使用BytesIO而不是StringIO:Here是提及此更改的发行说明。
import requests, zipfile, io
r = requests.get(zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
答案 1 :(得分:6)
使用urllib2.urlopen
。返回值是一个类似文件的对象,您可以read()
传递给zipfile
,等等。
答案 2 :(得分:4)
这是我在Python 3中的工作:
import zipfile, urllib.request, shutil
url = 'http://www....myzipfile.zip'
file_name = 'myzip.zip'
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
with zipfile.ZipFile(file_name) as zf:
zf.extractall()
答案 3 :(得分:4)
在this blog post的帮助下,我仅使用requests
就可以使用它。 stream
这件事很奇怪,所以我们不需要在大型请求上调用content
,这将要求立即处理所有请求,从而阻塞内存。 stream
通过一次遍历一个数据块来避免这种情况。
url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.zip'
target_path = 'alaska.zip'
response = requests.get(url, stream=True)
handle = open(target_path, "wb")
for chunk in response.iter_content(chunk_size=512):
if chunk: # filter out keep-alive new chunks
handle.write(chunk)
handle.close()
答案 4 :(得分:3)
使用urllib2.urlopen,或者您可以尝试使用优秀的Requests
模块并避免urllib2头痛:
import requests
results = requests.get('url')
#pass results.content onto secondary processing...
答案 5 :(得分:0)
感谢@yoavram提供上述解决方案, 我的网址路径链接到一个压缩的文件夹,并遇到BADZipfile错误 (文件不是zip文件),如果我尝试了几次,这很奇怪 检索网址并突然将其解压缩,所以我将解决方案稍作修改 一点。根据{{3}}
使用 is_zipfile 方法r = requests.get(url, stream =True)
check = zipfile.is_zipfile(io.BytesIO(r.content))
while not check:
r = requests.get(url, stream =True)
check = zipfile.is_zipfile(io.BytesIO(r.content))
else:
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
答案 6 :(得分:0)
我是来这里搜索如何保存.bzip2文件的。让我将代码粘贴给可能正在寻找它的其他人。
url = "http://api.mywebsite.com"
filename = "swateek.tar.gz"
response = requests.get(url, headers=headers, auth=('myusername', 'mypassword'), timeout=50)
if response.status_code == 200:
with open(filename, 'wb') as f:
f.write(response.content)
我只是想按原样保存文件。
答案 7 :(得分:0)
requests, zipfile and io
python 包。特别是 BytesIO 函数用于将解压后的文件保存在内存中,而不是将其保存到驱动器中。
import requests
from zipfile import ZipFile
from io import BytesIO
r = requests.get(zip_file_url)
z = ZipFile(BytesIO(r.content))
file = z.extract(a_file_to_extract, path_to_save)
with open(file) as f:
print(f.read())
答案 8 :(得分:0)
将 .zip 文件保存到磁盘位置的超轻量级解决方案(使用 Python 3.9):
import requests
url = r'https://linktofile'
output = r'C:\pathtofolder\downloaded_file.zip'
r = requests.get(url)
with open(output, 'wb') as f:
f.write(r.content)