通过python对文件夹中的所有文件进行搜索和替换?

时间:2010-06-24 13:42:23

标签: python scripting

我想学习使用python作为命令行脚本替换。我过去花了一些时间与python但是已经有一段时间了。这似乎属于它的范围。

我在一个文件夹中有几个文件,我想在所有文件夹中进行搜索和替换。我想用python脚本来做。

例如,使用“foo”搜索并替换“foobar”的所有实例。

4 个答案:

答案 0 :(得分:5)

欢迎使用StackOverflow。既然你想学习自己(+1),我会给你一些指示。

查看os.walk()以获取所有文件。

然后迭代文件中的每一行(for line in currentfile:在这里派上用场)。

现在你需要知道你是否想要一个“愚蠢”的替换(找到/替换每个foo即使它在一个单词的中间(比如foobar - 你想要{{1}结果?)或智能替代。

对于前者,请查看str.replace(),对于后者,请查看re.sub()并找出foofoobar的含义。

答案 1 :(得分: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.remove(file)之前添加os.rename(tempfile, file)

答案 2 :(得分: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")

对此的扩展是移动到文件夹中的文件夹。

答案 3 :(得分:0)

这是另一种选择,因为您提供了各种Python解决方案。在Unix / Windows中,最有用的实用程序(根据我)是GNU find命令和替换工具,如sed / awk。要搜索文件(递归)并进行替换,这样的简单命令就可以实现(语法来自内存而未经过测试)。这说找到所有文本文件并在其内容中将“旧”更改为“新”,同时使用sed备份原始文件...

$ find /path -type f -iname "*.txt" -exec sed -i.bak 's/old/new/g' "{}" +;