11

我正在尝试下载并打开一个压缩文件,并且似乎在使用带有 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)
4

5 回答 5

9

综上所述,以下内容从网站检索压缩文件中第一个文件的内容:

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()
于 2015-05-19T13:29:26.960 回答
5

您无法在urllib2.urlopened 文件中查找。它支持的方法在这里列出:http: //docs.python.org/library/urllib.html#urllib.urlopen

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

或者,您可以ed 文件,然后read()urlopen其放入 aStringIO中,然后使用zipfile它,如果您希望压缩数据在内存中。如果您只想提取文件extract而不是extract_all使用.zipfileread

于 2011-07-28T15:17:26.823 回答
4

自 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

于 2020-02-24T07:40:19.403 回答
2

我没有足够的代表发表评论,但关于上面 Marius 的回答,请注意对于 Python3,需要对 import 和 urlretrieve 调用进行轻微修改,因为 urllib 已被拆分为几个模块。

import urllib

变成:

import urllib.request

filehandle, _ = urllib.urlretrieve(url)

成为

filehandle, _ = urllib.request.urlretrieve(url)
于 2020-05-25T07:48:24.270 回答
1

迭代@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").

于 2020-11-26T23:15:52.117 回答