我正在尝试下载并打开压缩文件,似乎无法使用带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)
答案 0 :(得分:5)
您无法在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
,如果您想要内存中的压缩数据。如果您只想提取文件,请查看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")
。