我尝试从包含一个文件夹中的子文件夹的.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的工作方式,而不需要处理子目录).
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 = file(os.path.join(my_dir, filename), "wb")
with source, target:
shutil.copyfileobj(source, target)