如何在给定目录及其子目录中递归地用给定的替换替换文件中的字符串匹配?
伪代码:
import os
import re
from os.path import walk
for root, dirs, files in os.walk("/home/noa/Desktop/codes"):
for name in dirs:
re.search("dbname=noa user=noa", "dbname=masi user=masi")
// I am trying to replace here a given match in a file
原文由 Léo Léopold Hertz 준영 发布,翻译遵循 CC BY-SA 4.0 许可协议
将所有这些代码放入名为
mass_replace
的文件中。在 Linux 或 Mac OS X 下,您可以执行chmod +x mass_replace
然后运行它。在 Windows 下,您可以使用python mass_replace
后跟适当的参数来运行它。编辑:我已经从原来的答案中更改了上面的代码。有几个变化。首先,
mass_replace()
现在调用re.compile()
预编译搜索模式;其次,为了检查文件的扩展名,我们现在将文件扩展名的元组传递给.endswith()
而不是调用.endswith()
三次;第三,它现在使用最新版本的 Python 中可用的with
语句;最后,file_replace()
现在检查是否在文件中找到模式,如果没有找到模式则不重写文件。 (旧版本会重写每个文件,更改时间戳,即使输出文件与输入文件相同;这是不雅的。)编辑:我将其更改为默认替换每个文件,但是您可以编辑一行以将其限制为特定的扩展名。我认为替换每个文件是一个更有用的开箱即用的默认设置。这可以通过不涉及的扩展名或文件名列表、使其不区分大小写的选项等进行扩展。
编辑:在评论中,@asciimo 指出了一个错误。我对此进行了编辑以修复错误。
str.endswith()
记录为接受要尝试的字符串元组,但不是列表。固定的。另外,我让几个函数接受一个可选参数,让你传入一个扩展元组;应该很容易修改它以接受命令行参数来指定哪些扩展。