用Python下载并解压文件

15 投票
5 回答
28679 浏览
提问于 2025-04-16 22:27

我正在尝试下载并打开一个压缩文件,但在使用文件类型处理时遇到了麻烦,特别是在处理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 个回答

5

你不能在通过 urllib2.urlopen 打开的文件上进行查找操作。它支持的方法可以在这里查看:http://docs.python.org/library/urllib.html#urllib.urlopen

你需要先下载这个文件(可以用 urllib.urlretrieve,具体可以看这里:http://docs.python.org/library/urllib.html#urllib.urlretrieve),然后再用 zipfile 来处理它。

另外,你也可以先用 read() 方法读取这个通过 urlopen 打开的文件,然后把内容放到一个 StringIO 对象里,再用 zipfile 来处理这个对象,如果你想把压缩的数据保存在内存中。如果你只是想解压文件,可以看看 zipfileextractextract_all 方法,而不是使用 read

6

从2020年开始,你可以使用 dload 来下载和解压文件,也就是说:

import dload
dload.save_unzip("https://file-examples.com/wp-content/uploads/2017/02/zip_2MB.zip")

默认情况下,它会把文件解压到和脚本在同一个地方,并且文件夹的名字和压缩包的名字一样,但你也可以指定解压的位置:

dload.save_unzip("https://file-examples.com/wp-content/uploads/2017/02/zip_2MB.zip", "/extract/here")

安装方法是用 pip install dload

17

把这些内容结合起来,下面的代码可以从一个网站上的压缩文件中获取第一个文件的内容:

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()

撰写回答