Python批量替换文件内容脚本损坏最后一个文件的原因是什么?
问题根因
这个脚本仅损坏最后一个文件的核心原因是没有显式关闭打开的文件句柄,IO缓冲区内容未正常刷入磁盘:
- 循环内每次对文件先开读句柄、再开写句柄,全程没有调用
close()方法关闭文件对象,写入的内容会暂时保存在操作系统的IO缓冲区中,不会立刻写入磁盘。 - 前两次循环结束后,下一次循环会打开新的文件,这个操作会触发系统自动把上一个文件的缓冲区内容刷入磁盘,所以前两个文件的修改都能正常保存。
- 第三次(最后一次)循环结束后没有后续的IO操作,进程直接退出,最后一个文件的缓冲区内容还没来得及写入磁盘就被系统回收了,最终表现为文件被完全清空。
除此之外,原脚本还存在多个隐患:
- 正则编译放到了循环内,每次循环都会重复编译相同的正则表达式,浪费性能
- 没有过滤
os.listdir返回的子目录,如果目标路径下存在文件夹,直接打开文件夹会抛出异常 - 手动切换工作目录的写法容错性低,路径配置出错时容易操作到其他目录的文件
- 没有显式指定文件编码,不同系统默认编码不一致时容易出现乱码
修复后的代码
import os, re folder_path = 'C:/foofolder8' # 正则预编译放到循环外,仅编译一次即可 regex = re.compile('jersey') for filename in os.listdir(folder_path): file_path = os.path.join(folder_path, filename) # 跳过子目录,仅处理文件 if not os.path.isfile(file_path): continue # 用with上下文管理器自动管理文件句柄,操作完成后自动关闭文件 with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 执行替换 content = regex.sub('york', content) # 写入修改后的内容 with open(file_path, 'w', encoding='utf-8') as f: f.write(content)
内容的提问来源于stack exchange,提问作者Allure
相关产品推荐
相关产品推荐

