此问题已在此处有答案:
Recursively find and replace string in text files(10个答案)
昨天关门了。
我找了又找,但还没有找到一个简单的解决办法。很多完整的教程和博士论文,但我不想读一页页的东西。
**我想在一个目录中的所有文件和子目录中搜索和替换一个文本项。**我有一段代码,可以通过使用以下os.scandir()
参数之一在父目录中的选定文件和所有文件中搜索和替换:
'.'
os.getcwd()
()
(They得到相同的结果-只替换父目录中的内容,而不替换子目录或文本文件中的内容。我要替换所有指定的文本项字符串/text。)
**澄清:**它适用于任何选定的文件,但不适用于 * 不在 * 父目录中的项目。
我有一个包含Python代码、文本文件和子目录(文件夹)的目录,子目录包含更多的文本文件和更多的子目录。当然,我已经调整和调整,但我没有得到我想要的(虽然,我知道这很简单...)
这棵树看起来像这样:
下面是一段相关代码:
if(FLAG_Option == 2):
with os.scandir( ) as directory: # was '.' and theDIR, hum
for item in directory:
if not item.name.startswith('.') and item.is_file():
with open(item, mode="r+") as file:
data = file.read()
# print(data) # Before text replaced
data = data.replace(search_text, replace_text)
file.write(data)
print(data) # After text is replaced
with open(item, mode="w") as file:
file.write(data)
4条答案
按热度按时间mm5n2pyu1#
下面的代码将做你想要的。
更新
os.walk()
为每次迭代返回三个路径值的元组。directory path
、directory name
以及当前目录中每个files
的列表。所以for each
walk
这个方法会产生一个或多个文件名。当一个目录或子目录中有多个文件时,上述代码无法访问每个文件。下面的代码可以解决这个问题。我已经测试了多个文件在一个目录和子目录的深度达3个子目录。我还测试了一个以上的子目录,每个子目录包含自己的子目录等情况。
我的目录结构如下所示
busg9geu2#
你可以用
os.walk
遍历目录和子目录:nfeuvbwi3#
在查找父目录时,如果项目是目录,则只需递归调用子目录上的函数。
rqcrx0a64#
感谢所有的帖子。我玩了所有这些,虽然不同的方面产生了部分解决方案,但其中一个(完整/完整的代码,未发布)做了我所需要的,只要沿着目录和子目录的文件/内容前进。
而且它要干净/简单得多...添加搜索/替换是容易的部分;所以,下面是代码到需要搜索/替换的部分。
我将包括特定的文件类型不采取行动(在条件语句)。