2010-03-06 39 views
2

我想在文件中替换多个字符串。替换文件中的多个字符串

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

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

感谢

`

+1

您的代码不起作用,因为您直接将结果写入文件,因此它会多次输出数据。 如果你用'data = re.sub(key,value,data)'替换'fp1.write(re.sub(key,value,data)''它可以。 另外,是否有特定的原因使用're.sub'而不是'data.replace(key,value)' – Wolph 2010-03-06 13:42:13

+1

@WoLpH:为什么不把它作为答案? – 2010-03-06 13:46:30

+0

我不认为只是在同一组数据上调用replace是最好的解决方案,尽管我对这里最适合的解决方案有所怀疑 另外,由于它是一个就地替换,因此无论如何都可以更好地进行流式传输。 – Wolph 2010-03-06 14:31:28

回答

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() 
+1

此方法将在将“blog”更改为“bLOG”时字典是'{“log”:“LOG”}'当然这是假设OP要改变每一次出现,不管一个单词是否处于边界或不在。 – ghostdog74 2010-03-06 14:56:11

+1

**错误**答案呃:'data.replace' **不会改变数据'至少(字符串是不可变的!!!)。 – 2010-03-06 17:08:29

+0

是的,我纠正了错误。 – gruszczy 2010-03-06 20:03:05

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") 
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

谢谢,我的投票!这是我发现的处理重叠替换文本的唯一答案。即。 {'k1':'k2','k2':'k1'} – hopia 2011-01-25 23:11:43