如何通过Python在文件夹中对所有文件进行搜索和替换?

6 投票
4 回答
8241 浏览
提问于 2025-04-16 00:23

我想学习用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' 这个是什么意思。

撰写回答