Python批量替换txt文件关键词转存新文件夹 代码运行异常
问题概述
- 实现需求:借助字典结构存储键值对替换映射,批量替换指定文件夹下所有
.txt文件中的关键词,将修改后的文件保存至新的目标路径。 - 故障表现:代码运行后持续卡顿无响应,强制中断程序后仅生成一个空文件,未实现预期批量处理效果。
原代码核心问题
- 缩进错误导致逻辑完全错位:遍历文件的
for循环仅包含路径拼接、打开文件三个操作,读取内容、替换关键词、写入文件的逻辑全部在循环体外。循环执行时只会反复打开目录下的所有文件但不做任何处理,循环结束后仅会操作最后一次打开的文件,且之前打开的文件全部未正常关闭,存在资源泄漏。 - 未做文件类型过滤:
os.listdir会列出目录下所有子文件夹、非txt格式文件,直接尝试打开会触发权限错误、读取格式错误。 - 程序卡顿的根因:写入文件前错误调用
input()函数,该函数会阻塞进程等待用户手动输入内容,若用户未注意控制台的输入提示,程序会一直挂起,表现为无响应卡顿。强制中断程序时写入操作未完成,自然只会生成空文件。 - 兼容性不足:文件读写未指定编码,遇到非系统默认编码的文件会出现乱码;未提前判断目标输出目录是否存在,路径不存在时直接写入会触发报错。
- 字典加载逻辑鲁棒性差:读取替换字典时未跳过空行,若字典文件存在空行、或替换值中包含冒号,会触发分割报错导致程序中断。
修正后可运行代码
import os from pathlib import Path # 路径配置 source_dir = Path("C:\\Users\\myuser\\Documents\\scripts") target_dir = Path("C:\\Users\\myuser\\Documents\\scripts_new") dict_path = Path("C:\\Users\\myuser\\Desktop\\Python\\dictionary.txt") # 自动创建目标输出目录,已存在则不重复创建 target_dir.mkdir(parents=True, exist_ok=True) # 加载键值对替换字典 replace_dict = {} with open(dict_path, "r", encoding="utf-8") as f: for line in f: line = line.strip() # 跳过字典文件中的空行,避免分割报错 if not line: continue # 仅按第一个冒号分割,兼容替换值中包含冒号的场景 k, v = line.split(':', 1) replace_dict[k.strip()] = v.strip() # 遍历源目录处理所有txt文件 for filename in os.listdir(source_dir): source_file = os.path.join(source_dir, filename) # 跳过子目录、非txt格式文件 if not os.path.isfile(source_file) or not filename.lower().endswith(".txt"): continue # 读取原文件内容 with open(source_file, "r", encoding="utf-8") as f: content = f.read() # 批量替换关键词 for old_str, new_str in replace_dict.items(): content = content.replace(old_str, new_str) # 写入目标路径 target_file = os.path.join(target_dir, filename) with open(target_file, "w", encoding="utf-8") as f: f.write(content)
关键修正点
- 调整代码缩进,将文件读取、内容替换、写入的全流程放入文件遍历循环内部,确保每个符合要求的txt文件都能被正常处理。
- 统一使用
with上下文管理器处理所有文件读写操作,自动完成文件资源释放,同时指定utf-8编码规避乱码问题。 - 新增文件过滤逻辑,仅处理源目录下后缀为
.txt的普通文件,自动跳过子文件夹和其他格式文件,减少无效报错。 - 移除导致程序阻塞的
input()调用,替换完成后直接将处理后的内容写入目标文件,解决程序卡顿无响应的问题。 - 新增目标目录自动创建逻辑,无需手动提前新建输出文件夹。
- 优化字典加载逻辑,支持空行跳过、替换值包含冒号的场景,提升代码容错性。
内容的提问来源于stack exchange,提问作者Miszyn
相关产品推荐
相关产品推荐

