使用 Python 下载并解压缩文件
Posted
技术标签:
【中文标题】使用 Python 下载并解压缩文件【英文标题】:Download and unzip file with Python 【发布时间】:2011-07-28 15:12:26 【问题描述】:我正在尝试下载并打开一个压缩文件,但在使用带有 zipfile 的文件类型句柄时似乎遇到了问题。运行时出现错误“AttributeError: addinfourl instance has no attribute 'seek'”:
import zipfile
import urllib2
def download(url,directory,name):
webfile = urllib2.urlopen('http://www.sec.gov'+url)
webfile2 = zipfile.ZipFile(webfile)
content = zipfile.ZipFile.open(webfile2).read()
localfile = open(directory+name, 'w')
localfile.write(content)
localfile.close()
return()
download(link.get("href"),'./fails_data', link.text)
【问题讨论】:
【参考方案1】:综上所述,以下是从网站检索压缩文件中第一个文件的内容:
import urllib.request
import zipfile
url = 'http://www.gutenberg.lib.md.us/4/8/8/2/48824/48824-8.zip'
filehandle, _ = urllib.request.urlretrieve(url)
zip_file_object = zipfile.ZipFile(filehandle, 'r')
first_file = zip_file_object.namelist()[0]
file = zip_file_object.open(first_file)
content = file.read()
【讨论】:
对于较新的python版本,请在第一行执行import urllib.request as urllib
。【参考方案2】:
您无法在 urllib2.urlopen
ed 文件中查找。它支持的方法在这里列出:http://docs.python.org/library/urllib.html#urllib.urlopen。
您必须检索文件(可能使用urllib.urlretrieve
、http://docs.python.org/library/urllib.html#urllib.urlretrieve),然后对其使用zipfile
。
或者,如果您希望压缩数据在内存中,您也可以read()
urlopen
ed 文件,然后将其放入StringIO
,然后在其上使用zipfile
。如果您只想提取文件而不是使用read
,请查看zipfile
的extract
和extract_all
方法。
【讨论】:
【参考方案3】:从 2020 年开始,您可以使用dload 下载并解压缩文件,即:
import dload
dload.save_unzip("https://file-examples.com/wp-content/uploads/2017/02/zip_2MB.zip")
默认情况下,它会以 zip 文件名提取到脚本路径上的目录,但您可以指定提取位置:
dload.save_unzip("https://file-examples.com/wp-content/uploads/2017/02/zip_2MB.zip", "/extract/here")
使用pip install dload
安装
【讨论】:
有人维护这个吗?自 3 月以来我没有看到一个提交? @Ari 看起来不像,这很不幸,因为它看起来像一个非常酷的包。我在使用save_unzip
时也遇到了this error【参考方案4】:
我没有足够的代表发表评论,但关于上面 Marius 的回答,请注意对于 Python3,由于 urllib 已被拆分为多个模块,因此需要对导入和 urlretrieve 调用进行轻微修改。
import urllib
变成:
import urllib.request
和
filehandle, _ = urllib.urlretrieve(url)
变成
filehandle, _ = urllib.request.urlretrieve(url)
【讨论】:
【参考方案5】:迭代@Marius 答案(直接从 zip 中读取单个文件),如果要将所有文件提取到目录中,请执行以下操作:
import urllib
import zipfile
url = "http://www.gutenberg.lib.md.us/4/8/8/2/48824/48824-8.zip"
extract_dir = "example"
zip_path, _ = urllib.request.urlretrieve(url)
with zipfile.ZipFile(zip_path, "r") as f:
f.extractall(extract_dir)
这会将 zip 文件存储在一个临时目录中。如果您想保留它,可以将文件名传递给urlretrieve
,例如urllib.request.urlretrieve(url, "my_zip_file.zip")
.
【讨论】:
以上是关于使用 Python 下载并解压缩文件的主要内容,如果未能解决你的问题,请参考以下文章