在python中解压缩文件

Joh*_*ard 367 python zip unzip zipfile

我通读了zipfile模块文档,但无法理解如何解压缩文件,只知道如何压缩文件.如何将zip文件的所有内容解压缩到同一目录中?

Rah*_*hul 632

import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
    zip_ref.extractall(directory_to_extract_to)
Run Code Online (Sandbox Code Playgroud)

这就是它!

  • 如果.zip存档的内容在所有.zip档案中都相同怎么办?如何在提取之前重命名内容?例如:1.zip 2.zip ..都包含content.txt:提取所有像1content.txt 2content.txt? (7认同)
  • @iratzhash我通常使用tempfile为内容创建一个新的临时目录:https://docs.python.org/3/library/tempfile.html我解压缩到临时目录并从那里移动/组织文件. (7认同)
  • @ 3kstc我会`从zipfile导入ZipFile`.使用它时,您不再需要使用`zipfile.ZipFile`,并且可以使用`ZipFile(zip_file_name)`. (6认同)
  • 我添加:`from tempfile import mkdtemp; Directory_to_extract_to = mkdtemp()` (4认同)
  • 这里不需要`try / except`吗?或更好:`with zipfile .... as zip_ref` (3认同)
  • thnx,注意:没有 zipfile 库,不需要 pip install,zipfile 已经存在了...... (3认同)

use*_*137 281

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

import zipfile
with zipfile.ZipFile("file.zip","r") as zip_ref:
    zip_ref.extractall("targetdir")
Run Code Online (Sandbox Code Playgroud)

您不需要使用closetry/catch,因为它使用 上下文管理器构造.

  • ZipFile在2.7或更高版本中也可用作上下文管理器:https://docs.python.org/2/library/zipfile.html#zipfile.ZipFile (18认同)
  • 这与接受的答案相同吗? (3认同)
  • `zipfile` + `pathlib` = win. 介意我稍微更新一下你的答案吗? (2认同)
  • 是否有理由避免使用 `os.system(f'tar -xvzf {filename}')` 而是使用 zipfile (例如 `zip = ZipFile('file.zip'); zip.extractall() )` 或 `shutil .unpack_archive(文件名, extract_dir)`? (2认同)
  • @CharlieParker 主要原因是可移植性。“系统”调用取决于操作系统。例如,“tar”在 Windows 上不可用。 (2认同)

fon*_*ini 41

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

make_archive已在答案中进行了描述。至于unpack_archive

import shutil
shutil.unpack_archive(filename, extract_dir)
Run Code Online (Sandbox Code Playgroud)

unpack_archive从的“扩展”自动检测压缩格式filename.zip.tar.gz等),也是如此make_archive。此外,filename并且extract_dir可以是自 Python 3.7 以来的任何类似路径的对象(例如pathlib.Path实例)。

  • @CharlieParker你已经在另一个答案的评论中问了同样的事情,并且该评论已得到答复:/sf/ask/241577801/?noredirect=1#comment119468939_36662770` os.system` 不可移植,会带来安全问题,更难正确使用(例如,当路径包含特殊字符时,您的建议会失败),并且可读性较差。 (13认同)
  • 当 zip 文件具有自定义扩展名时,此方法不起作用,例如(OmegaT 项目包为“.omt”)。它给出 `raise ReadError("Unknown archive format '{0}'".format(filename))`。 (4认同)

Dan*_*een 36

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

zip = ZipFile('file.zip')
zip.extractall()
Run Code Online (Sandbox Code Playgroud)

  • @DanGayle这似乎是将zip文件解压缩到当前工作目录,而不是zip文件的位置 (9认同)
  • 如果您不像其他答案所建议的那样使用“with”语句,则需要在最后使用“zip.close()”。 (4认同)
  • 如果您只是提取到与zipfile相同的目录,那就不是了 (3认同)
  • 对我来说,ZipFile()没有工作,但zipfile.ZipFile()做了 - 导入zipfile后 (3认同)

sim*_*eco 18

您也可以只导入ZipFile

from zipfile import ZipFile
zf = ZipFile('path_to_file/file.zip', 'r')
zf.extractall('path_to_extract_folder')
zf.close()
Run Code Online (Sandbox Code Playgroud)

适用于Python 2Python 3


Ind*_*a K 14

如果你想在 shell 中完成,而不是编写代码。

 python3 -m zipfile -e myfiles.zip myfiles/
Run Code Online (Sandbox Code Playgroud)

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

  • ZIP 文件不是 tar 文件。除非您有处理 ZIP 存档的特殊版本的“tar”,否则您的命令根本不起作用。带有“-z”选项的“tar”处理gzip压缩的tar档案(通常是扩展名为“.tgz”或“.tar.gz”的文件) (4认同)
  • 为什么不在你的情况下只执行“tar -xvzf path_file”? (2认同)

Nic*_*ens 13

from zipfile import ZipFile
ZipFile("YOURZIP.zip").extractall("YOUR_DESTINATION_DIRECTORY")
Run Code Online (Sandbox Code Playgroud)

您将提取文件的目录以前不需要存在,此时您可以命名它

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

如果您尝试以管理员身份启动您的IDE(即:Anaconda),请考虑逃避路径中的/其他人/permission denied

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


小智 12

尝试这个 :


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() 
Run Code Online (Sandbox Code Playgroud)

path : 解压文件的路径