用Pythonreplace文件中的文本
我是Python新手。 我希望能够打开一个文件,并通过Pythonreplace给定replace的某些单词的每个实例。 举个例子,用'0'replace'零',用'bob'代替'temp',用'nothing'来代替'garbage'。
我刚开始使用这个:
for line in fileinput.input(fin): fout.write(line.replace('zero', '0')) fout.write(line.replace('temp','bob')) fout.write(line.replace('garbage','nothing'))
但我不认为这是一个甚至是远程正确的方式来做到这一点。 然后,我想了解if语句来检查这行代码是否包含这些内容,如果是这样,那么replace这行代码中的哪一行,但是从我所了解的Python来看,这也不是一个真正理想的解决scheme。 我很想知道什么是最好的方法来做到这一点。 谢谢提前!
这应该做到这一点
replacements = {'zero':'0', 'temp':'bob', 'garbage':'nothing'} with open('path/to/input/file') as infile, open('path/to/output/file', 'w') as outfile: for line in infile: for src, target in replacements.iteritems(): line = line.replace(src, target) outfile.write(line)
编辑 :要解决Eildosa的评论 ,如果你想这样做,而不写入另一个文件,那么你最终将不得不读取你的整个源文件到内存中:
lines = [] with open('path/to/input/file') as infile: for line in infile: for src, target in replacements.iteritems(): line = line.replace(src, target) lines.append(line) with open('path/to/input/file', 'w') as outfile: for line in lines: outfile.write(line)
编辑:如果您使用Python 3.x,请使用replacements.items()
而不是replacements.iteritems()
我可能会考虑使用一个dict
和re.sub
的东西:
import re repldict = {'zero':'0', 'one':'1' ,'temp':'bob','garage':'nothing'} def replfunc(match): return repldict[match.group(0)] regex = re.compile('|'.join(re.escape(x) for x in repldict)) with open('file.txt') as fin, open('fout.txt','w') as fout: for line in fin: fout.write(regex.sub(replfunc,line))
这replace
了一个轻微的优势,它是重叠比赛更强大一点。
如果你的文件很短(甚至不是很长),你可以使用下面的代码来replace文本:
# Replace variables in file with open('path/to/in-out-file', 'r+') as f: content = f.read() f.seek(0) f.truncate() f.write(content.replace('replace this', 'with this'))
基本的方法是
-
read()
, -
data = data.replace()
就像你需要的那样 -
write()
。
如果您一次读取或写入整个数据,或者更小的部分由您决定。 您应该使其取决于预期的文件大小。
read()
可以replace为对文件对象的迭代。
更快的方式写它将是…
in = open('path/to/input/file').read() out = open('path/to/input/file', 'w') replacements = {'zero':'0', 'temp':'bob', 'garbage':'nothing'} for i in replacements.keys(): in = in.replace(i, replacements[i]) out.write(in) out.close
这消除了其他答案所提出的许多迭代,并且将加速更长文件的处理。
从标准input中读取,写入'code.py'如下:
import sys rep = {'zero':'0', 'temp':'bob', 'garbage':'nothing'} for line in sys.stdin: for k, v in rep.iteritems(): line = line.replace(k, v) print line
然后,使用redirect或pipe道执行脚本( http://en.wikipedia.org/wiki/Redirection_(computing); )
python code.py < infile > outfile
这是我刚刚使用的一个简短而简单的例子:
如果:
fp = open("file.txt", "w")
然后:
fp.write(line.replace('is', 'now')) // "This is me" becomes "This now me"
不:
line.replace('is', 'now') fp.write(line) // "This is me" not changed while writing