替换文件中的多个字符串

时间:2010-03-06 13:37:19

标签: python

我正在尝试替换文件中的多个字符串。

fp1 = open(final,"w")
data = open(initial).read()
for key, value in mydict.items():
    fp1.write(re.sub(key,value, data)
fp1.close()

但只有我的最后一个键值被替换。如何替换文件中的所有键值。 有没有更好的方法来替换文件中的多个字符串。

由于

`

3 个答案:

答案 0 :(得分:5)

这是正则表达式真正有用的一项任务:

import re

def replacemany(adict, astring):
  pat = '|'.join(re.escape(s) for s in adict)
  there = re.compile(pat)
  def onerepl(mo): return adict[mo.group()]
  return there.sub(onerepl, astring)

if __name__ == '__main__':
  d = {'k1': 'zap', 'k2': 'flup'}
  print replacemany(d, 'a k1, a k2 and one more k1')

作为主脚本运行,根据需要打印a zap, a flup and one more zap

这当然关注字符串,而不是文件 - 替换本身就是在字符串到字符串的转换中发生的。基于RE的方法的优点是减少了循环:由于正则表达式引擎,所有要替换的字符串在一次传递中匹配。 re.escape调用确保包含特殊字符的字符串被视为文字(没有奇怪的含义;-),垂直条表示RE模式语言中的“或”,sub方法调用嵌套每个匹配的onerepl函数,传递匹配对象,以便.group()调用轻松检索刚匹配且需要替换的特定字符串。

要在文件级别工作,

with open(final, 'w') as fin:
  with open(initial, 'r') as ini:
    fin.write(replacemany(mydict, ini.read()))

建议使用with语句,以确保正确关闭文件;如果你坚持使用Python 2.5,请在模块或脚本的开头使用from __future__ import with_statement来使用with语句。

答案 1 :(得分:0)

这应该更好。

fp1 = open(final,"w")
fp2 = open(initial, 'r')
data = fp2.read()
fp2.close()
for key, value in mydict.items():
    data = data.replace(key, value)
fp1.write(data)
fp1.close()

答案 2 :(得分:0)

fp1 = open("final","w")
fp2 = open("file", 'r')
for line in fp2:
    sline=line.rstrip().split()
    for n,item in enumerate(sline):
        if item in d:
            sline[n]=d[item]
    fp1.write(' '.join(sline) +"\n")