使用shutil库压缩文件时能否取消子文件夹层级,将所有文件放在压缩包同一层级?
问题解答
shutil.make_archive 仅支持保留原有目录结构压缩,没有内置参数可以直接实现扁平化打包,你不需要提前手动归集所有文件,借助Python自带的zipfile库配合目录遍历就能实现需求,代码实现成本很低。
实现思路
- 用
os.walk遍历目标根目录下的所有层级,收集所有文件的绝对路径 - 向压缩包写入文件时,仅保留原文件名作为压缩包内的存储路径,丢弃原有目录层级
注意事项
如果不同子目录下存在同名文件,直接扁平化写入会导致后写入的文件覆盖先写入的文件,如有需要可以自行添加重命名逻辑(比如给同名文件加序号后缀)。
示例代码
import os import zipfile def flatten_zip(root_dir, output_zip_path): # 创建zip文件,用ZIP_DEFLATED模式开启压缩 with zipfile.ZipFile(output_zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf: # 遍历root_dir下的所有目录和文件 for dirpath, _, filenames in os.walk(root_dir): for filename in filenames: # 拼接得到文件的完整路径 full_file_path = os.path.join(dirpath, filename) # 写入压缩包时仅用filename作为路径,实现扁平化 zipf.write(full_file_path, arcname=filename) # 调用示例 flatten_zip('./dir_name', './output.zip')
运行上述代码后生成的output.zip,内部就只会包含所有文件,没有任何子文件夹层级,和你期望的输出效果一致。
内容的提问来源于stack exchange,提问作者Tristan Tran
相关产品推荐
相关产品推荐

