使用Python按条件自动批量复制文件 脚本仅复制单文件问题求解
问题原因
- 校验逻辑位置错误:代码仅在初始化时读取了硬编码的
factadwords.Rout文件做内容校验,遍历所有.Rout文件时没有对每个文件单独做内容匹配判断,相当于所有文件的复制逻辑都绑定了第一个固定文件的校验结果。 - 递归遍历写法错误:
glob.glob(os.path.join(src,'*.Rout'), recursive=True)无法实现递归扫描子目录,要递归匹配所有层级的.Rout文件,需要使用**通配符,写法为os.path.join(src, '**', '*.Rout')。 - 逻辑顺序颠倒:原代码是先判断固定文件是否符合条件,再执行批量复制,没有做到「每个文件单独校验、符合条件才复制」的需求。
修改后的完整代码
import glob import os import shutil import pandas as pd end_str = '#--- END ---------------------------------------------------------------------------------------------------' src = r'C:/Users/jj/Desktop/autotranscribe' dest = r'C:/Users/jj/Desktop/Bulk_Wav' # 提前创建目标目录避免不存在报错 os.makedirs(dest, exist_ok=True) if __name__ == '__main__': # 递归遍历所有层级下的.Rout文件 for file_path in glob.glob(os.path.join(src, '**', '*.Rout'), recursive=True): # 对每个文件单独做内容校验 df = pd.read_fwf(file_path, header=None) # 校验不包含指定结束字符串则复制 if not df[0].str.contains(end_str).any(): new_path = os.path.join(dest, os.path.basename(file_path)) shutil.copy(file_path, new_path) # 可选:打印复制日志确认文件 print(f"已复制符合条件的文件:{file_path}")
可选优化(大文件场景)
如果.Rout文件体积较大,用pandas读取开销较高,可以替换校验逻辑为直接逐行匹配,性能更高:
import glob import os import shutil end_str = '#--- END ---------------------------------------------------------------------------------------------------' src = r'C:/Users/jj/Desktop/autotranscribe' dest = r'C:/Users/jj/Desktop/Bulk_Wav' os.makedirs(dest, exist_ok=True) def check_file_contains(file_path, target_str): with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: for line in f: if target_str in line: return True return False if __name__ == '__main__': for file_path in glob.glob(os.path.join(src, '**', '*.Rout'), recursive=True): if not check_file_contains(file_path, end_str): new_path = os.path.join(dest, os.path.basename(file_path)) shutil.copy(file_path, new_path)
注意事项
- 如果不同子目录下存在同名的.Rout文件,复制到目标目录会被直接覆盖,需要保留层级的话可以在目标目录下重建原文件的相对目录结构再复制。
- 读取文件时如果遇到编码报错,可以调整
open或pd.read_fwf的encoding参数为你文件对应的编码(比如gbk)。
内容的提问来源于stack exchange,提问作者NewInPython
相关产品推荐
相关产品推荐

