2013-10-28 91 views
2

即時通訊新的python。Python迭代字典替換字符串

我必須通過目錄搜索並找到其中包含字符串kyle和john的文件,並分別將它們替換爲mike和jim。每個文件可以有凱爾或約翰或兩者。

這裏是我的代碼

import os 
import fileinput 
import sys 

rootdir ='C:/Users/sid/Desktop/test' 
searchTerms = {"kyle":"mike","john":"jim"} 
#old= "kyle" 
#new = "mike" 

def replaceAll(file,searchExp,replaceExp): 
    for line in fileinput.input(file, inplace=1): 
     if searchExp in line: 
      line = line.replace(searchExp,replaceExp) 
      sys.stdout.write(line) 

for subdir, dirs, files in os.walk(rootdir): 
    for file in files: 
      path=subdir+'/'+file 
      for oldline, newline in searchTerms.items(): 
       replaceAll(path,oldline,newline) 

我現在已經創建了在它SAMPLE.TXT一個test文件夾,在sample.txt的我有一句話凱爾它。但是當我運行該程序的文件沒有內容,甚至凱爾不在那裏。 你能告訴我什麼即時做錯了。我認爲問題在於我的replaceAll函數。在行if searchExp in line沒有得到正確執行。你能告訴我爲什麼?

+0

您是否嘗試使用例如打印報表?你可以打印'file'來檢查它是否被找到,'line'來檢查你的行,在正則表達式之後行,...這將幫助你自己回答你的問題! (對不起,不張貼答案,但這似乎是功課;)) – OBu

+0

沒有人,即時學習蟒蛇。這是我在某處找到的問題。實際的問題要複雜得多。我爲自己做了簡單的事情。所以這是一個普遍的疑問。這不是我的功課。雅我已經試圖把打印陳述,在舊線和新線凱爾和麥克正在存儲,但當我通過他們的功能,我認爲有什麼問題。另外,你可以看到註釋行,如果我只是取消註釋掉那些舊行,在searchTerms.items()中換行,並用replaceAll(path,old,new)代替它的工作正常。 – Wolf

+0

那麼開始吧,你正在寫stdout而不是文件。 –

回答

1

你必須寫的所有行 - 不僅與變化,因爲fileinput.input()(與inplace=1)將文本複製到temporaty文件讀取它,並明確oryginal文件行再次寫入所有行 - 但你必須自己寫所有的線。

您可以按如下方式移動sys.stdout.write(line)來解決問題。

def replaceAll(file,searchExp,replaceExp): 
    for line in fileinput.input(file, inplace=1): 
     if searchExp in line: 
      line = line.replace(searchExp,replaceExp) 
     sys.stdout.write(line) 

沒有inplace=1你必須做你自己 - 讀oryginal文件中的所有行,寫全行臨時文件,並在年底更換oryginal文件,臨時文件。

+0

感謝兄弟。那就是訣竅 – Wolf

1

fileinput.input(file, inplace=1)被稱爲in-place filtering

EG。

有一個sample.txt具有線kyle kyle kyle

在第一步驟中,所述線kyle kyle kyle被加工成mike mike mike

然後,行mike mike mike將被視爲新的輸入行。

新行中沒有「kyle」或「john」,所以沒有輸出將被寫入sample.txt


參考:http://docs.python.org/2/library/fileinput.html#fileinput.FileInput

+0

那麼我應該怎麼做才能用sample.txt文件中的麥克替換凱爾。如果我改變inplace = 0,那麼輸出正在寫入控制檯而不是寫入文件。我應該如何將它寫入文件。 – Wolf

+0

也許您可以將這些行寫入新文件。 – Inapt

+0

沒有傢伙,我必須在同一個文件中取代它。 – Wolf