批量替换文件里的bug:想换字符串,非得先把文件复制一份出来,在新文件上修改才行。

说实在的,这是个挺让人头疼的事儿。前阵子我也写了篇文章教大家批量替换文件里的内容,结果大家发现了个bug:想要换字符串,非得先把文件复制一份出来,在新文件上修改才行。要是文档多了上百份,手动复制粘贴简直就是体力活儿;更让人尴尬的是,这要是手一抖把原文件给覆盖了,那可就麻烦大了。就不能不搞那么多重复步骤,直接在源文件上动手吗?这事儿我琢磨了很久,终于在这段代码里找到了答案。 核心思路特别简单:把文件打开的时候指定个 buffering=1,这样读一行就立刻写一行,根本用不着关掉原文件去生成临时文件。剩下的步骤就跟常规操作差不多了:把指定文件夹和子文件夹里的内容走一遍,看看是不是Python文件(要换别的后缀比如.txt也行),然后逐行读进来,把旧的字符串换成新的字符串,最后再写回原文件。 看看这段代码就知道了,连30行都不到。给它一个路径、旧字符串和新字符串,它就能干活。我用它来替换当前目录和子目录下所有.py文件里的"print('Hello')",变成"print('Hi')"。大家可以直接把这段代码copy过去用。 不过呢,这里面也有个小技巧。默认情况下,这个脚本只处理.py文件。如果你想同时处理.txt文件,也很简单,在if语句里再加个判断就行了。只要一行代码,就能支持更多格式的文件替换,不用再写一遍循环。 最后还得提个醒:直接在原文件上进行“读—改—写”,会不会损坏文件呢?不用担心。Python的r+模式加上buffering=1,能保证读写操作同步进行。文件内容在内存里改好后立马就写回去了,不会产生临时缓冲区。我在一个有上万行代码的大项目里实测过了,原文件内容完好无损,速度也比老办法快太多了。要是心里还不踏实,可以先备份一下再运行脚本嘛。