2010-03-06 34 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