Python脚本使用shutil复制含PROTEIN关键词文件时为何生成双副本?
Python脚本异常副本问题排查
异常现象对应根因
- 匹配逻辑偏离需求:代码原本设计是检测文件名中是否包含'protein'关键词,但实际实现是对从当前工作目录开始的完整文件路径做大写转换后匹配。只要文件的任意上级目录名包含不区分大小写的'protein'字符,即便文件名没有相关关键词,也会被触发复制流程。
- 重复副本来源:目标目录本身的名称包含"protein"关键词,虽然代码设置了目录排除规则,但匹配范围覆盖全路径,当遍历流程没有完全阻断对目标目录的扫描时,已经复制到目标目录的文件会被二次匹配,重复执行复制操作。
- 截断文件名的形成原因:当
shutil.copy的目标参数没有被正确识别为目录时,会默认将源文件写入目标参数对应的路径,生成一个和目标目录同名、无扩展名的文件,视觉上即为文件名被截断的异常副本。
修正后的实现代码
import os import shutil def main(): keyword = 'PROTEIN' final_destination = './These_are_your_protein_files' location = os.getcwd() # 自动创建目标目录,已存在则不报错 os.makedirs(final_destination, exist_ok=True) exclude = {'These_are_your_protein_files'} for root_path, dir_names, file_names in os.walk(location, topdown=True): # 遍历前过滤掉目标目录,避免进入循环扫描 dir_names[:] = [d for d in dir_names if d not in exclude] for file_name in file_names: # 仅校验文件名本身是否包含关键词,排除路径名干扰 if keyword in file_name.upper(): source_file = os.path.join(root_path, file_name) # 显式指定目标文件路径,避免路径类型判断偏差 target_file = os.path.join(final_destination, file_name) shutil.copy(source_file, target_file) if __name__ == "__main__": main()
关键修正点
- 替换原有目标目录判断创建逻辑,使用
os.makedirs(exist_ok=True)确保目标路径始终为有效目录,避免类型判定偏差。 - 将关键词匹配范围从完整文件路径调整为文件名本身,严格匹配递归遍历、按文件名匹配的需求。
- 显式拼接源文件和目标文件的完整路径,避免
shutil.copy对目标路径类型的自动判断逻辑带来的异常文件名问题。 - 排除列表使用集合类型存储,提升目录过滤的匹配效率。
内容的提问来源于stack exchange,提问作者user15126067
相关产品推荐
相关产品推荐

