使用Python下载并解压缩文件

时间:2011-07-28 15:12:26

标签: python download zipfile

我正在尝试下载并打开压缩文件,似乎无法使用带zipfile的文件类型句柄。运行这个时,我收到错误“AttributeError:addinfourl实例没有属性'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)

5 个答案:

答案 0 :(得分:5)

您无法在urllib2.urlopen个ed文件上搜索。它支持的方法在此处列出:http://docs.python.org/library/urllib.html#urllib.urlopen

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

或者,您可以read() urlopen ed文件,然后将其放入StringIO,然后使用zipfile,如果您想要内存中的压缩数据。如果您只想提取文件,请查看extract的{​​{1}}和extract_all方法,而不是使用zipfile

答案 1 :(得分:3)

将事物放在一起,以下内容从网站检索压缩文件中第一个文件的内容:

import urllib
import zipfile

url = 'http://www.gutenberg.lib.md.us/4/8/8/2/48824/48824-8.zip'
filehandle, _ = urllib.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()

答案 2 :(得分: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 :(得分:2)

我没有足够的评论对此做评论,但是关于上面的Marius的回答,请注意,对于python3,由于urllib已分为几个模块,因此对import和urlretrieve调用需要进行一些修改。

import urllib

成为:

import urllib.request

filehandle, _ = urllib.urlretrieve(url)

成为

filehandle, _ = urllib.request.urlretrieve(url)

答案 4 :(得分:0)

在@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")