我尝试从.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"
这将打开zip存档成员的文件句柄,提取文件名并将其复制到目标文件(这样就ZipFile.extract可以正常工作,而无需照顾子目录)。
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)