You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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同目录)
  • ...以此类推

问题分析

原代码存在两个核心问题:

  1. Zip文件存储路径错误:创建ZipFile时仅使用文件名(file[0:-4] + '.zip'),会在脚本运行的当前工作目录生成zip包,而非目标子文件夹内。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:45:49