2014-01-26 110 views
1

我有一個文本文件,去行說:蟒蛇替換文本文件中的字不通過線

This is a text document 
written in notepad 

我想用一句話「文件」和「記事本」字'來代替「文件」記事本「,然後我想保存/覆蓋文件。現在,沒有一行一行,因爲我知道我可以做

wordReplacements = {'document':'file', 'notepad':'Notepad'} 
contents = open(filePath, 'r') 
for line in contents: 
    for key, value in wordReplacements.iteritems(): 
     line = line.replace(key, value) 
contents.close() 

但有沒有辦法做到這一點,而不是逐行? 注意:我正在使用python 2.7。

+0

從[docs](http://docs.python.org/2/tutorial/inputoutput.html)引用,'爲了從文件中讀取行,您可以遍歷文件對象。這是內存高效,速度快,並導致簡單的代碼' – thefourtheye

+0

您可能可以使用re.sub爲整個文檔,但逐行更好。 – dstromberg

回答

1

docs報價,

對於從文件中讀取行,你就可以通過文件對象循環。這 是內存高效,快速,並導致簡單的代碼

所以,我是你,我會做這樣的

import os 
wordReplacements = {'document':'file', 'notepad':'Notepad'} 

def transform_line(line): 
    for key, value in wordReplacements.iteritems(): 
     line = line.replace(key, value) 
    return line 

with open("Output.txt", "w") as output_file, open("Input.txt") as input_file: 
    for line in input_file: 
     output_file.write(transform_line(line)) 

os.rename("Output.txt", "Input.txt") 

如果你喜歡的俏皮話,更換with與此

with open("Output.txt", "w") as output_file, open("Input.txt") as input_file: 
    output_file.write("".join(transform_line(line) for line in input_file)) 

部分如果內存是不是一個問題,你還是想不來遍歷文件對象,你可以擁有整個文件的內容轉移到內存中,然後替換療法e

import re 
with open("Input.txt") as open_file: 
    data = open_file.read() 
for key, value in wordReplacements.iteritems(): 
    data = re.sub(key, value, data) 
with open("Input.txt", "wb") as open_file: 
    open_file.write(data) 
+0

hm,如果我現在執行data.close(),它會保存並覆蓋現有的Input.txt嗎?因爲這就是我想要做的 – user2817200

+0

hm,好吧,如果我在「open_file:for key」,wordReplacements.iteritems()中的值:line = line.replace(key,value)「然後「open_file.close()」,這將保存文件? – user2817200

+0

@ user2817200請現在檢查我的答案。 – thefourtheye

2
with open(sys.argv[1]) as f: 
    words = f.read().replace("foo", "bar") 

with open(sys.argv[1], "wb") as f: 
    f.write(words) 
+2

爲什麼你先將'words'設置爲None? :/ – geoffspear

+0

@Claris hm,我們如何以二進制模式(wb)選擇文件?我們需要,還是隻能用(w)打開它?另外,f後自動關閉「words = f.read()。replace(」foo「,」bar「)」? – user2817200

+1

文本模式更適合文本文件。 「with」語句將在文件不再需要時關閉該文件。 – dstromberg

0

使用類似的代碼,也可以使用re模塊中可用的re.sub方法根據正則表達式進行替換。但是,如果您需要替換N個模式,則使用此方法將需要遍歷文件內容N次。