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

使用Python压缩文件夹时如何避免包含多余上级目录?

Python压缩文件夹时移除多余目录的解决方法

用zipfile压缩单个文件的代码可以正常运行:

with zipfile.ZipFile("jam.zip", "w") as zippy:
  zippy.write('custard.txt')

但压缩文件夹时,原代码生成的压缩包会多一层多余的temp目录:

import os
import zipfile

myfolder = "D:\\temp\\myfolder"
thefiles = os.listdir(myfolder)
with zipfile.ZipFile("jam.zip", "w") as zippy:
  for file in thefiles:
    file_path = os.path.join(myfolder, file)
    zippy.write(file_path)

生成的压缩包结构:

jam.zip
└── temp
    └── myfolder
        └── custard.txt

想要改成的目标结构:

jam.zip
└── myfolder
    └── custard.txt

解决思路

问题出在zippy.write()默认会把文件的完整系统路径存入压缩包,所以带上了temp层级。只需用arcname参数指定压缩包内的路径,就能自定义目录结构。

方法一:支持遍历子目录的完整写法

如果目标文件夹里有子目录,用os.walk遍历更全面:

import os
import zipfile

myfolder = "D:\\temp\\myfolder"
with zipfile.ZipFile("jam.zip", "w") as zippy:
    # 遍历目标文件夹下的所有文件和子目录
    for root, dirs, files in os.walk(myfolder):
        for file in files:
            file_path = os.path.join(root, file)
            # 计算文件相对于myfolder父目录的路径,作为压缩包内的路径
            arcname = os.path.relpath(file_path, os.path.dirname(myfolder))
            zippy.write(file_path, arcname=arcname)

方法二:仅遍历一级文件的简化写法

如果目标文件夹里只有一级文件,直接修改原代码即可:

import os
import zipfile

myfolder = "D:\\temp\\myfolder"
thefiles = os.listdir(myfolder)
with zipfile.ZipFile("jam.zip", "w") as zippy:
    for file in thefiles:
        file_path = os.path.join(myfolder, file)
        # 指定压缩包内的路径为myfolder/文件名
        arcname = os.path.join(os.path.basename(myfolder), file)
        zippy.write(file_path, arcname=arcname)

两种方法都能让压缩包只保留myfolder作为根目录,去掉多余的temp层级。

内容的提问来源于stack exchange,提问作者Ghoul Fool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:25:22