怎么从zip里提取文件 Python

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么从zip里提取文件 Python相关的知识,希望对你有一定的参考价值。

参考技术A Python自带模块zipfile可以完成zip压缩文件的读写,而且使用非常方便,下面就来演示一下Python读写zip文件:
  Python读zip文件
  下面的代码给出了用Python读取zip文件,打印出压缩文件里面所有的文件,并读取压缩文件中的第一个文件。
  import
zipfile
  z
=
zipfile.ZipFile("zipfile.zip",
"r")
  #打印zip文件中的文件列表
  for
filename
in
z.namelist(
):
  print
'File:',
filename
  #读取zip文件中的第一个文件
  first_file_name
=
z.namelist()[0]
  content
=
z.read(first_file_name)
  print
first_file_name
  print
content
  Python写/创建zip文件
  Python写Zip文件主要用到ZipFile的write函数。
  import
zipfile
  z
=
zipfile.ZipFile('test.zip',
'w',
zipfile.ZIP_DEFLATED)
  z.write('test.html')
  z.close(
)
  在创建ZipFile实例的时候,有2点要注意:
  要用'w'或'a'模式,用可写的方式打开zip文件
压缩模式有ZIP_STORED

ZIP_DEFLATED,ZIP_STORED只是存储模式,不会对文件进行压缩,这个是默认值,如果你需要对文件进行压缩,必须使用ZIP_DEFLATED模式。

从 Python3 中的 zip 存档中提取特定文件夹的内容

【中文标题】从 Python3 中的 zip 存档中提取特定文件夹的内容【英文标题】:Extract the content of a specific folder from a zip archive in Python3 【发布时间】:2020-02-19 12:58:21 【问题描述】:

我有一个 zip 存档,其内部结构如下所示:

file.zip
  |
   --- foo/
  |
   --- bar/
        |
         --- file1.txt
        |
         --- dir/
              |
               --- file2.txt

我想使用 python3 将bar 的内容提取到输出目录,得到如下所示的内容:

output-dir/
    |
     --- file1.txt
    |
     --- dir/
          |
           --- file2.txt

但是,当我在bar 下面运行代码时,它的内容被提取到output-dir

import zipfile

archive = zipfile.ZipFile('path/to/file.zip')

for archive_item in archive.namelist():
    if archive_item.startswith('bar/'):
        archive.extract(archive_item, 'path/to/output-dir')

我该如何解决这个问题? 谢谢!

【问题讨论】:

不是真正的解决方案,而是一种规避问题的方法:解压到path/to,得到path/to/bar,然后将path/to/bar 重命名为path/to/output-dir 更改archive_item.startswith('file/bar/')会给出bar目录内容 【参考方案1】:

不要使用ZipFile.extract,而是使用ZipFile.openopenshutil.copyfileobj 以便将文件准确地放在您想要的位置,使用路径操作来创建输出你需要的路径。

archive = zipfile.ZipFile('path/to/file.zip')
PREFIX = 'bar/'
out = pathlib.Path('path/to/output-dir')
for archive_item in archive.namelist():
    if archive_item.startswith(PREFIX):
        # strip out the leading prefix then join to `out`, note that you 
        # may want to add some securing against path traversal if the zip
        # file comes from an untrusted source
        destpath = out.joinpath(archive_item[len(PREFIX):])
        # make sure destination directory exists otherwise `open` will fail
        os.makedirs(destpath.parent, exist_ok=True)
        with archive.open(archive_item) as source,
             open(destpath, 'wb') as dest:
            shutil.copyfileobj(source, dest)

类似的东西。

【讨论】:

我建议把4改成len('bar/'),这样更容易修改。

以上是关于怎么从zip里提取文件 Python的主要内容,如果未能解决你的问题,请参考以下文章

从 Python3 中的 .zip 文件中提取和读取 [重复]

如何从 zip 中提取 csv 文件并在 python 中将其保存到磁盘? [复制]

从 zip 文件中提取文件并保留 mod 日期?

下载一个 zip 文件并使用 Python3 将其提取到内存中

python怎么提取出文件里的指定内容

使用 Python 将 zip 文件和嵌套的 zip 文件提取到目标目录中