34

我是 Python 新手。我希望能够打开一个文件并通过 Python 用给定的替换替换某些单词的每个实例。例如,将每个单词“zero”替换为“0”,将“temp”替换为“bob”,将“garbage”替换为“nothing”。

我第一次开始使用这个:

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 语句来检查该行是否包含这些项目,如果包含,则替换该行包含哪一个,但据我对 Python 的了解,这也不是一个真正理想的解决方案。我很想知道最好的方法是什么。提前谢谢!

4

7 回答 7

84

这应该这样做

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.items():
            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.items():
            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 2.x,请使用replacements.iteritems()而不是replacements.items()

于 2012-10-26T14:58:06.390 回答
8

如果您的文件很短(甚至不是很长),您可以使用以下代码段来替换文本:

# 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'))
于 2016-01-21T23:20:57.213 回答
7

我可能会考虑使用dictandre.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,因为它对重叠匹配更加健壮。

于 2012-10-26T15:00:42.800 回答
5

基本的方法是

  • read(),
  • data = data.replace()只要你需要,然后
  • write().

如果您一次读取和写入整个数据或以较小的部分读取和写入数据,则取决于您。您应该使其取决于预期的文件大小。

read()可以用对文件对象的迭代替换。

于 2012-10-26T14:56:45.083 回答
3

更快的写作方式将是......

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

这消除了其他答案建议的许多迭代,并将加快处理更长文件的过程。

于 2012-10-26T15:08:12.773 回答
0

从标准输入读取,编写“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

然后,使用重定向或管道( http://en.wikipedia.org/wiki/Redirection_(computing))执行脚本

python code.py < infile > outfile
于 2012-10-26T16:09:28.987 回答
-1

这是我刚刚使用的一个简短的示例:

如果:

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
于 2016-03-05T02:16:38.820 回答