如何用Python将子文件夹中对应txt文件压缩至同目录同名zip包?
问题描述
我是Python新手,希望将DATA目录下各子文件夹中的.txt文件分别压缩为同名.zip包,且.zip包需存放在对应子文件夹中。以下是我的代码,但无法正常运行:
import os import zipfile for folder, subfolders, files in os.walk('DATA'): for file in files: if file.endswith('.txt'): with zipfile.ZipFile(file[0:-4] + '.zip', 'w') as fzip: fzip.write(os.path.join(folder, file), os.path.relpath(os.path.join(folder, file), 'DATA'), compress_type=zipfile.ZIP_DEFLATED)
文件路径示例:
- DATA\1\AA.txt
- DATA\2\AB.txt
- DATA\3\AC.txt
- DATA\4\AD.txt
- DATA\5\AE.txt
- DATA\6\AF.txt
- DATA\7\AG.txt
期望生成的zip文件路径:
- D:\DATA\1\AA.zip(与AA.txt同目录)
- D:\DATA\2\AB.zip(与AB.txt同目录)
- ...以此类推
问题分析
原代码存在两个核心问题:
- Zip文件存储路径错误:创建
ZipFile时仅使用文件名(file[0:-4] + '.zip'),会在脚本运行的当前工作目录生成zip包,而非目标子文件夹内。 - Zip包内文件路径冗余:
os.path.relpath(..., 'DATA')会让zip包内保留1/AA.txt这类层级路径,不符合“zip内仅存目标txt文件”的常规需求。
修正后的代码
import os import zipfile # 遍历DATA目录下所有文件夹与文件 for folder, _, files in os.walk('DATA'): for file in files: if file.endswith('.txt'): # 构造zip文件的完整存储路径:子文件夹 + 同名zip zip_full_path = os.path.join(folder, os.path.splitext(file)[0] + '.zip') # 获取txt文件的完整路径 txt_full_path = os.path.join(folder, file) with zipfile.ZipFile(zip_full_path, 'w', zipfile.ZIP_DEFLATED) as fzip: # 指定arcname为原文件名,确保zip内直接存放该文件,不带层级路径 fzip.write(txt_full_path, arcname=file)
修正说明
- 用
os.path.join(folder, ...)构造zip文件的完整路径,确保zip包生成在对应子文件夹中。 - 用
os.path.splitext(file)[0]替代file[0:-4],更安全地提取无后缀文件名(避免文件名长度不足4的异常情况)。 arcname=file指定zip包内的文件名为原txt文件名,消除冗余层级路径。
内容的提问来源于stack exchange,提问作者Chetan
相关产品推荐
相关产品推荐

