【问题标题】:Extracting zip file contents to specific directory in Python 2.7将 zip 文件内容提取到 Python 2.7 中的特定目录
【发布时间】:2012-02-24 13:56:11
【问题描述】:

这是我目前用来提取与脚本位于同一当前工作目录中的 zip 文件的代码。如何指定要提取到的其他目录?

我尝试的代码没有提取到我想要的位置。

import zipfile

fh = open('test.zip', 'rb')
z = zipfile.ZipFile(fh)
for name in z.namelist():
    outfile = open(name, 'wb')
    outfile.write('C:\\'+z.read(name))
    outfile.close()
fh.close()

【问题讨论】:

  • 是否应该将 'C:\\'+ 移动到 open 调用而不是 write 调用?

标签: python windows compression


【解决方案1】:

我想你只是在这里搞混了。应该是这样的:

import zipfile

fh = open('test.zip', 'rb')
z = zipfile.ZipFile(fh)
for name in z.namelist():
    outpath = "C:\\"
    z.extract(name, outpath)
fh.close()

如果您只想提取所有文件:

import zipfile

with zipfile.ZipFile('test.zip', "r") as z:
    z.extractall("C:\\")

对最新版本的 Python 使用 pip install zipfile36

import zipfile36

【讨论】:

  • ZipFile 没有属性 __exit__ 所以我不知道你的 with 语句是如何工作的。
  • 如果你创建一个ZipFile 实例,它确实有一个__exit__ 方法。我只是给了这个例子另一个尝试(python 2.7),它的工作原理和写的一样。
  • Python 2.6 由于某种原因有不同的 ZipFile 实现。
  • 是的,查看文档 (docs.python.org/2/library/zipfile.html),它说 ZipFile 仅支持从 python 2.7 起用作上下文管理器 - 我没有尝试使用 2.6,因为在这种情况下,问题指定了 python 2.7
【解决方案2】:

如果你只是想使用 Python 从命令行中提取一个 zip 文件(比如因为你没有可用的 unzip 命令),那么你可以直接调用 zipfile 模块

python -m zipfile -e monty.zip target-dir/

看看docs。它还支持压缩和列出内容。

【讨论】:

    【解决方案3】:

    我尝试了这个帖子中的其他答案,但对我来说最终的解决方案很简单:

    zfile = zipfile.ZipFile('filename.zip')
    zfile.extractall(optional_target_folder)
    

    查看extractall,但仅将其用于可信赖的 zip 文件。

    【讨论】:

    • 我建议也调用zfile.close(),正如ZipFile.close 中所说,您必须在退出程序之前调用close(),否则将不会写入基本记录。 .
    【解决方案4】:

    添加到上面secretmike的答案,支持python 2.6提取所有文件。

    import zipfile
    import contextlib
    
    
    with contextlib.closing(zipfile.ZipFile('test.zip', "r")) as z:
       z.extractall("C:\\")
    

    【讨论】:

      【解决方案5】:

      Peter de Rivaz 在上面的评论中有一点。您将希望在调用 open() 时拥有该目录。 你会想做这样的事情:

      import zipfile
      import os
      
      os.mkdir('outdir')
      fh = open('test.zip','rb')
      z = zipfile.ZipFile(fh)
      for name in z.namelist():
          outfile = open('outdir'+'/'+name, 'wb')
          outfile.write()
          outfile.close()
      fh.close()
      

      【讨论】:

        【解决方案6】:

        我已修改代码以询问用户输入 文件名 及其需要提取的路径,因此用户将拥有更多控制权将提取的文件夹放在哪里以及应该为提取的文件夹分配什么名称。

        import zipfile
        
        #picking zip file from the directory
        ZipFileName = raw_input("Enter full path to zip file:")  
        fh = open( ZipFileName , 'rb')
        z = zipfile.ZipFile(fh)
        
        #assigning a name to the extracted zip folder
        DestZipFolderName = raw_input("Assign destination folder a name: ")
        DestPathName = raw_input("Enter destination directory: ")
        DestPath = DestPathName + "\\" + DestZipFolderName
        
        for name in z.namelist():   
            outpath = DestPath
            z.extract(name, outpath)
        fh.close()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多