2016-09-20 182 views
0

我試圖用一塊文本替換一小段文本。我希望這塊文本將被替換使用Python的替換功能。我真的很想用sed來獲得這份工作,但我在Windows機器上。無論如何,這裏是我的腳本,不知道爲什麼文本塊沒有被替換。用文本塊替換特定文本

# Change the current working directory to IDX location 
import os 
print os.getcwd() 
os.chdir(##location of my text files##) 
print os.getcwd() 

#Read file names 

com_line=raw_input("File name please:") 
contents=[] 
strs = '#DREFIELD IDOL_SOURCE="idol source"\n#DREFIELD IDOL_TAXONOMY="taxonomy data"\n #DREFIELD IDOL_CATEGORY="IDOL_CATEGORY"\n #DREFIELD IDOL_PROMOTION="idol_promotion"\n #DREFIELD IDOL_PROMOTION_TERM="IDOL_PROMOTION_TERM"\n #DREFIELD IDOL_WHATSNEW="IDOL_WHATSNEW"\n #DREFIELD IDOL_SUMMARY="IDOL_SUMMARY"\n #DREFIELD IDOL_URL="IDOL_URL DATA"\n #DREFIELD IDOL_FORMNUMBER="IDOL_FORMNUMBER"\n #DREFIELD IDOL_DESCRIPTION="IDOL_DESCRIPTION DATA"\n#DRESECTION 0\n' 
with open(com_line) as f: 
    contents.append(f.readlines()) 
f.close 

#Writing to file 
f2 = open("test.idx", 'w') 

for content in contents: 
    for s in content: 
     if s == '#DRESECTION 0\n': 
      s.replace("#DRESECTION 0\n", strs) 
     f2.write("%s" % s) 
f2.close 

我測試了這個代碼,它也輸入了條件語句。只是想知道爲什麼有需要的文字#DRESECTION 0\n不會被替換爲strs?此外,我正在尋找這樣的操作大型文本文件值得一些演出。有沒有更好的方式閱讀python中的大文本文件?

回答

3

Python中的Stings是不可變的。一旦創建了一個字符串對象,它就不能被修改。然而,你可以根據舊的創建一個新的字符串。

當您致電s.replace時,它不會修改s,因爲這是不可能的。相反,str.replace方法返回一個新的字符串。你可以做s = s.replace(...),它應該工作。但是,如果只能將名稱重新綁定到新字符串,則用另一個字符串替換一個字符串的全部內容是沒有意義的。

我建議使用:

if s == '#DRESECTION 0\n': 
     s = strs 
    f2.write(s) 

我也改變了write電話。這裏不需要使用字符串替換,因爲你想寫整個字符串(並且沒有額外的)。只需通過s作爲參數。

還有其他一些次要的問題與您的代碼:

舉例來說,你不叫上您的文件close方法,只給它們命名。如果您想要實際關閉文件,則需要f2.close()。但您實際上並不需要爲f這麼做,因爲您使用的with聲明將自動關閉該文件(對於f2,您應該可以使用with,而不要打擾手動close調用)。

也似乎沒有太多的需要contents是一個嵌套列表(外表中只有一個項目)。您可能想要執行contents = f.readlines()而不是append將行列表初始化爲空列表。這將讓你擺脫後面的代碼中的一個循環。