
本文介绍如何用 Python 的 zipfile 模块精准压缩指定父目录下的所有子文件夹及其内容,跳过顶层父目录结构,实现解压后直接得到 Folder1、Folder2 等子文件夹,避免冗余嵌套。
本文介绍如何用 python 的 `zipfile` 模块精准压缩指定父目录下的所有子文件夹及其内容,跳过顶层父目录结构,实现解压后直接得到 folder1、folder2 等子文件夹,避免冗余嵌套。
在使用 shutil.make_archive 直接压缩整个父目录时,ZIP 文件会完整保留原始路径层级(如 Parent folder/Folder1/1.txt),导致解压后多出一层不必要的父目录。要实现“解压即见 Folder1、Folder2”的扁平化结构,关键在于:将每个文件写入 ZIP 时,仅使用其相对于父目录的子路径(即剔除 Parent folder/ 前缀)作为归档内路径。
以下是一个健壮、可复用的解决方案:
import os
import glob
import zipfile
def compress_subfolders(parent_path, output_zip, include_parent_dir=False):
"""
将 parent_path 下的所有直接子文件夹(及其全部内容)压缩为单个 ZIP 文件。
:param parent_path: 父目录路径(如 'Parent folder')
:param output_zip: 输出 ZIP 文件路径(如 'archive.zip')
:param include_parent_dir: 若为 True,则保留父目录名作为 ZIP 根目录(不推荐);默认 False(扁平化)
"""
# 获取所有子文件夹下的非空文件(支持多级嵌套,但仅从子文件夹开始采集)
files_to_compress = []
for subfolder in os.listdir(parent_path):
subpath = os.path.join(parent_path, subfolder)
if os.path.isdir(subpath):
# 递归收集该子文件夹下所有文件(含子子目录)
for root, dirs, files in os.walk(subpath):
for file in files:
files_to_compress.append(os.path.join(root, file))
with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zipf:
for file_path in files_to_compress:
if include_parent_dir:
# 保留完整相对路径(含父目录名)
arcname = os.path.relpath(file_path, os.path.dirname(parent_path))
else:
# 关键:移除 parent_path,使 Folder1/... 成为 ZIP 内顶层路径
arcname = os.path.relpath(file_path, parent_path)
zipf.write(file_path, arcname)
# 使用示例
if __name__ == "__main__":
parent_folder = "Parent folder" # 替换为你的实际父目录名
output_zip = "combined_2024.zip"
compress_subfolders(parent_folder, output_zip)
print(f"✅ 已成功打包 {len(glob.glob(os.path.join(parent_folder, '*/*.*')))}+ 个文件到 {output_zip}")✅ 核心要点说明:
librosa 是一个用于音频和音乐分析的 Python 库。它提供了特征提取、频谱分析、节拍跟踪、起始检测和音频可视化的工具,基于 NumPy 和 SciPy 构建,用于科学音频计算。
- os.path.relpath(file_path, parent_path) 是实现“去父目录”的关键——它生成如 Folder1/1.txt 而非 Parent folder/Folder1/1.txt;
- 使用 os.walk() 替代 glob.glob(..., recursive=True) 更可靠,能正确处理空子目录、隐藏文件及跨平台路径分隔符;
- zipfile.ZIP_DEFLATED 启用压缩(减小体积),若仅需归档可省略;
- 不建议依赖 shutil.make_archive 实现此需求,因其无法自定义内部路径映射。
⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 确保 parent_path 是绝对路径或相对于当前工作目录的有效路径;
- 若子文件夹中存在同名文件(如 Folder1/README.md 和 Folder2/README.md),ZIP 中将保留两者,无冲突;
- 如需排除特定文件类型(如 .pyc, .log),可在 os.walk() 循环中添加 if not file.endswith(('.pyc', '.log')): 过滤逻辑。
运行后生成的 ZIP 文件解压结果将严格符合预期:直接呈现 Folder1/, Folder2/ 等顶层子目录,结构清晰、开箱即用。

















