怎么从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(
):
'File:',
filename
#读取zip文件中的第一个文件
first_file_name
=
z.namelist()[0]
content
=
z.read(first_file_name)
first_file_name
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.open
、open
和shutil.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 中将其保存到磁盘? [复制]