小编典典

从zip中提取文件,而不使用python ZipFile保留结构?

python

我尝试从.zip提取包含一个文件夹中的子文件夹的所有文件。我希望子文件夹中的所有文件都仅提取到一个文件夹中而不保留原始结构。此刻,我提取所有内容,将文件移动到文件夹,然后删除以前的子文件夹。具有相同名称的文件将被覆盖。

在写入文件之前可以这样做吗?

例如,这是一个结构:

my_zip/file1.txt
my_zip/dir1/file2.txt
my_zip/dir1/dir2/file3.txt
my_zip/dir3/file4.txt

最后,我希望:

my_dir/file1.txt
my_dir/file2.txt
my_dir/file3.txt
my_dir/file4.txt

我可以在此代码中添加什么?

import zipfile
my_dir = "D:\\Download\\"
my_zip = "D:\\Download\\my_file.zip"

zip_file = zipfile.ZipFile(my_zip, 'r')
for files in zip_file.namelist():
    zip_file.extract(files, my_dir)
zip_file.close()

如果我从zip_file.namelist()重命名文件路径,则会出现此错误:

KeyError: "There is no item named 'file2.txt' in the archive"

阅读 245

收藏
2020-12-20

共1个答案

小编典典

这将打开zip存档成员的文件句柄,提取文件名并将其复制到目标文件(这样就ZipFile.extract可以正常工作,而无需照顾子目录)。

import os
import shutil
import zipfile

my_dir = r"D:\Download"
my_zip = r"D:\Download\my_file.zip"

with zipfile.ZipFile(my_zip) as zip_file:
    for member in zip_file.namelist():
        filename = os.path.basename(member)
        # skip directories
        if not filename:
            continue

        # copy file (taken from zipfile's extract)
        source = zip_file.open(member)
        target = open(os.path.join(my_dir, filename), "wb")
        with source, target:
            shutil.copyfileobj(source, target)
2020-12-20