使用 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.urlopened 文件中查找。它支持的方法在这里列出:http://docs.python.org/library/urllib.html#urllib.urlopen。

您必须检索文件(可能使用urllib.urlretrieve、http://docs.python.org/library/urllib.html#urllib.urlretrieve),然后对其使用zipfile

或者,如果您希望压缩数据在内存中,您也可以read()urlopened 文件,然后将其放入StringIO,然后在其上使用zipfile。如果您只想提取文件而不是使用read,请查看zipfileextractextract_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 下载并解压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

从内存中的 FTP 下载 Zip 文件并解压缩

iPhone:在运行时在主包子目录中下载 zip 并解压缩

如果通过验证,AWS lambda 读取 zip 文件执行验证并解压缩到 s3 存储桶

markdown Tar(tar.gz)并解压缩文件

java 复制,删除,从存档中删除文件并解压缩

python python zipfile获取并解压缩片段