如何通过Python在文件夹中对所有文件进行搜索和替换?
我想学习用Python来替代命令行脚本。我之前接触过Python,但已经有一段时间没用了。现在看来,这个需求是Python可以做到的。
我有几个文件在一个文件夹里,我想在这些文件中进行搜索和替换。我想用一个Python脚本来完成这个任务。
比如说,把所有的"foo
"替换成"foobar
"。
4 个回答
1
我研究了一下,这个方法似乎有效,不过如果能指出任何错误就太好了。
import fileinput, sys, os
def replaceAll(file, findexp, replaceexp):
for line in fileinput.input(file, inplace=1):
if findexp in line:
line = line.replace(findexp, replaceexp)
sys.stdout.write(line)
if __name__ == '__main__':
files = os.listdir("c:/testing/")
for file in files:
newfile = os.path.join("C:/testing/", file)
replaceAll(newfile, "black", "white")
进一步的扩展可以是将文件夹放在文件夹里面。
2
通常我会用老办法 perl -pi -e 's/foo/foobar/'
来处理这个,但如果你想用Python的话:
import os
import re
_replace_re = re.compile("foo")
for dirpath, dirnames, filenames in os.walk("directory/"):
for file in filenames:
file = os.path.join(dirpath, file)
tempfile = file + ".temp"
with open(tempfile, "w") as target:
with open(file) as source:
for line in source:
line = _replace_re.sub("foobar", line)
target.write(line)
os.rename(tempfile, file)
如果你是在Windows系统上,还需要在 os.rename(tempfile, file)
之前加上 os.remove(file)
。
5
欢迎来到StackOverflow!既然你想自己学习(真不错!),我给你一些建议。
你可以看看 os.walk()
,这个可以帮助你找到所有的文件。
接下来,你需要逐行读取文件的内容(这里可以用 for line in currentfile:
这个写法)。
然后你要决定是要“简单”的替换(也就是找到每个 foo
并替换掉,即使它在一个单词中间,比如 foobar
- 你想要的结果是 foofoobar
吗?)还是“智能”的替换。
如果是简单替换,可以看看 str.replace()
;如果是智能替换,可以看看 re.sub()
,并弄明白 r'\bfoo\b'
这个是什么意思。