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

使用Python的shutil模块能否选择性归档目录中的指定文件与子目录?

解决方案

当然可以实现!shutil.make_archive确实会默认打包指定目录下的全部内容,但我们有两种实用的方法来精准归档你需要的audio/目录和其中的fileA,而排除fileB。

方法一:临时目录中转法

这种方法通过构建一个只包含目标内容的临时目录结构,再用shutil.make_archive打包,完美适配你原本习惯的shutil用法:

import shutil
import tempfile
import os

# 获取当前脚本所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 定义目标文件和目录的路径
audio_dir = os.path.join(current_dir, "audio")
target_file = os.path.join(audio_dir, "fileA")

# 创建临时目录(with块结束后自动清理)
with tempfile.TemporaryDirectory() as temp_dir:
    # 在临时目录中重建audio子目录结构
    temp_audio_dir = os.path.join(temp_dir, "audio")
    os.makedirs(temp_audio_dir, exist_ok=True)
    
    # 把需要的fileA复制到临时audio目录
    shutil.copy2(target_file, temp_audio_dir)
    
    # 打包临时目录,生成的zip会保留audio/fileA的层级结构
    shutil.make_archive("new_file", "zip", temp_dir)

说明:临时目录会在with代码块执行完毕后自动删除,无需手动清理,非常安全。

方法二:用zipfile手动构建压缩包(更高效)

如果不想创建临时目录,可以直接使用Python内置的zipfile模块手动控制要添加的内容,这种方式更轻量化:

import zipfile
import os

current_dir = os.path.dirname(os.path.abspath(__file__))
audio_dir = os.path.join(current_dir, "audio")

# 创建并写入zip文件,使用ZIP_DEFLATED开启压缩
with zipfile.ZipFile("new_file.zip", "w", zipfile.ZIP_DEFLATED) as zipf:
    # 添加audio目录本身(保证归档后有层级结构)
    zipf.write(audio_dir, arcname="audio")
    
    # 添加audio目录下的fileA,指定归档后的路径
    fileA_path = os.path.join(audio_dir, "fileA")
    zipf.write(fileA_path, arcname=os.path.join("audio", "fileA"))

说明:如果不需要单独添加空的audio目录,也可以只添加fileA并指定arcname="audio/fileA",解压时会自动创建对应的audio目录。这种方法适合需要自定义筛选规则的场景,比如按文件名后缀、大小等过滤文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:05:20