我想学习使用python作为命令行脚本替换。我过去花了一些时间与python但是已经有一段时间了。这似乎属于它的范围。
我在一个文件夹中有几个文件,我想在所有文件夹中进行搜索和替换。我想用python脚本来做。
例如,使用“foo
”搜索并替换“foobar
”的所有实例。
答案 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' "{}" +;