使用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
相关产品推荐
相关产品推荐

