【问题标题】:Unzipping files in Python在 Python 中解压缩文件
【发布时间】:2011-03-27 22:31:14
【问题描述】:

我阅读了zipfile documentation,但不明白如何解压缩文件,只知道如何压缩文件。如何将 zip 文件的所有内容解压缩到同一目录中?

【问题讨论】:

标签: python zip unzip zipfile


【解决方案1】:
import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
    zip_ref.extractall(directory_to_extract_to)

差不多就是这样!

【讨论】:

  • 如果 .zip 存档的内容在所有 .zip 存档中都相同怎么办?如何在提取之前重命名内容?示例:1.zip 2.zip.. all contains content.txt : 像 1content.txt 2content.txt 一样提取所有内容?
  • @iratzhash 我通常使用 tempfile 为内容创建一个新的临时目录:docs.python.org/3/library/tempfile.html 我解压缩到临时目录并从那里移动/组织文件。
  • @3kstc 我会from zipfile import ZipFile。使用时不再需要使用zipfile.ZipFile,可以使用ZipFile(zip_file_name)
  • thnx,注意:没有zipfile库,不用pip安装,zipfile已经存在了……
  • 我要加:from tempfile import mkdtemp; directory_to_extract_to = mkdtemp()
【解决方案2】:

如果您使用的是 Python 3.2 或更高版本:

import zipfile
with zipfile.ZipFile("file.zip","r") as zip_ref:
    zip_ref.extractall("targetdir")

你不需要使用 closetry/catch ,因为它使用 context manager 建设。

【讨论】:

  • ZipFile 在 2.7 或更高版本中也可用作上下文管理器:docs.python.org/2/library/zipfile.html#zipfile.ZipFile
  • 如何处理docs.python.org/3.6/library/zipfile.html#zipfile.BadZipFile异常?一般来说,将 try/except 与上下文管理器(with-statement)一起使用的最佳做法是什么?
  • zipfile + pathlib = 胜利。介意我稍微更新一下你的答案吗?
  • 是否有理由避免使用os.system(f'tar -xvzf {filename}') 而使用压缩文件(例如zip = ZipFile('file.zip'); zip.extractall() )shutil.unpack_archive(filename, extract_dir)
  • @CharlieParker 主要原因是便携性。 system 调用取决于操作系统。例如,tar 在 Windows 上不可用。
【解决方案3】:

zipfile 是一个有点低级的库。除非您需要它提供的细节,否则您可以使用shutil 的高级函数make_archiveunpack_archive

make_archive 已在this 答案中描述。至于unpack_archive

import shutil
shutil.unpack_archive(filename, extract_dir)

unpack_archive 自动从filename 的“扩展名”(.zip.tar.gz 等)检测压缩格式,make_archive 也是如此。此外,自 Python 3.7 起,filenameextract_dir 可以是任何 path-like 对象(例如 pathlib.Path 实例)。

【讨论】:

  • 此方法在 zip 文件具有自定义扩展名时不起作用,例如(.omt 用于 OmegaT 项目包)。它给了raise ReadError("Unknown archive format '{0}'".format(filename))
  • @msoutopico 您可以明确指定 thje 格式:shutil.unpack_archive(filename, extract_dir, format)
  • os.system(f'tar -xvzf {path2zip} -C {path2unzip}/') 有什么问题?
  • @CharlieParker 您已经在对另一个答案的评论中提出了同样的问题,并且该评论得到了回答:stackoverflow.com/questions/3451111/unzipping-files-in-python/… os.system 不可移植,会引发安全问题,更难正确使用(例如,当路径包含特殊字符时,您的提案会失败),并且可读性较差。
【解决方案4】:

如果您使用的是 Python 2.6+,请使用 extractall 方法

zip = ZipFile('file.zip')
zip.extractall()

【讨论】:

  • 你不需要指定目的地(zip.extractall(destination))吗?
  • 如果您只是解压到与 zipfile 相同的目录中,则不会
  • @DanGayle 这似乎是将 zip 文件解压缩到当前工作目录,而不是 zip 文件的位置
  • 对我来说,ZipFile() 不起作用,但 zipfile.ZipFile() 起作用 - 在导入 zipfile 之后
  • 如果您不像其他答案建议的那样使用with 语句,则需要在最后使用zip.close()
【解决方案5】:

你也可以只导入ZipFile:

from zipfile import ZipFile
zf = ZipFile('path_to_file/file.zip', 'r')
zf.extractall('path_to_extract_folder')
zf.close()

适用于 Python 2Python 3

【讨论】:

  • 感谢您的关注@MylesHollowed 但是,这不是已接受答案的副本。我同意它们彼此相似,但它们不同。您的评论也表明了这一点,因为接受的评论对您来说肯定比我的更好。如果是副本,那将是相同的...对于某些人来说,我的答案可能很有价值,因为它可能更具可读性,并且您注意到导入的代码更少...正是由于这些差异,我决定提出我的答案给出一个替代方案。这不就是为什么我们可以在接受一个答案后提出其他答案吗?万事如意
  • 这个答案有什么问题?为什么有人给她负分?毕竟,它是问题的答案,并且与其他答案相比,它的简单性与众不同,这对于一些正在寻找答案的人来说可能很重要。不是吗?
  • @MylesHollowed import zipfile.ZipFile 在 3.6.5 中生成 ModuleNotFoundError: No module named 'zipfile.ZipFile'; 'zipfile' is not a package。我愿意承认这是我的操作员错误,但我不知道它是什么。
  • @MikeF 我在使用 Python 3.8.5 时遇到了同样的问题,但解决方法是使用 from zipfile import ZipFile。希望这会有所帮助。
【解决方案6】:

试试这个:


import zipfile
def un_zipFiles(path):
    files=os.listdir(path)
    for file in files:
        if file.endswith('.zip'):
            filePath=path+'/'+file
            zip_file = zipfile.ZipFile(filePath)
            for names in zip_file.namelist():
                zip_file.extract(names,path)
            zip_file.close() 

path : 解压文件路径

【讨论】:

    【解决方案7】:

    如果你想在 shell 中做,而不是写代码。

     python3 -m zipfile -e myfiles.zip myfiles/
    

    myfiles.zip 是 zip 存档,myfiles 是解压文件的路径。

    【讨论】:

    • 在你的情况下为什么不直接使用tar -xvzf path_file
    • ZIP 文件不是 tar 文件。除非您有一个特殊版本的 tar 来处理 ZIP 档案,否则您的命令根本不起作用。带有-z 选项的tar 处理gzip 压缩的tar 档案(通常是扩展名为.tgz.tar.gz 的文件)
    【解决方案8】:
    from zipfile import ZipFile
    ZipFile("YOURZIP.zip").extractall("YOUR_DESTINATION_DIRECTORY")
    

    你将提取文件的目录以前不需要存在,你现在命名它

    如果您的项目位于同一目录中,则您的 ZIP.zip 是 zip 的名称。 如果没有,请使用 PATH 即:C://....//YOURZIP.zip

    考虑通过 PATH 中的另一个 / 转义 / 如果您有permission denied,请尝试以管理员身份启动您的 ide(即:Anaconda)

    YOUR_DESTINATION_DIRECTORY 将创建在与您的项目相同的目录中

    【讨论】:

    • 对我来说非常相似
    【解决方案9】:
    import os 
    zip_file_path = "C:\AA\BB"
    file_list = os.listdir(path)
    abs_path = []
    for a in file_list:
        x = zip_file_path+'\\'+a
        print x
        abs_path.append(x)
    for f in abs_path:
        zip=zipfile.ZipFile(f)
        zip.extractall(zip_file_path)
    

    如果文件不是 zip,则不包含对文件的验证。如果文件夹包含非 .zip 文件,它将失败。

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多