【问题标题】:Download and unzip file with Python使用 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)

【问题讨论】:

    标签: python download zipfile


    【解决方案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.urlretrievehttp://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").

        【讨论】:

          猜你喜欢
          • 2019-06-14
          • 2011-05-28
          • 1970-01-01
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-27
          • 2021-03-03
          • 2017-02-03
          相关资源
          最近更新 更多