2012-02-16 107 views
2

在下面的代碼我試圖以取代中有以下內容的文件的內容。 hellohello world和hellohello應你好更換並寫回file.Ho去這個蟒蛇搜索和寫入文件

#!/usr/bin/python 
    import os 

    new_file_list=[] 
    all_files=os.listdir("/tmp") 
    for ff in all_files: 
    if ff.endswith(".txt"): 
     new_file_list.append(ff) 

    for files in new_file_list: 
    if files == "a.txt": 
     print "=======================================" 
     file_name="/tmp/"+str(files) 
     print file_name 
     f=open(file_name ,"rw") 
     while True: 
     print "=======================================" 
     for line in f.readline(): 
      print line 
      print "=======================================" 
      f.write(line.replace("hellohello","hello")) 
      print line 
     else: 
      break 
     for line in f.readline(): 
     print line 

    f.close() 

回答

1

您可以使用fileinput模塊替換文件中的字符串來代替(不用打開兩個文件或打開同一個文件或加載整個文本文件到內存中的代碼)。

#!/usr/bin/python 
import os 
import fileinput 

new_file_list=[] 
all_files=os.listdir("/tmp") 
for ff in all_files: 
if ff.endswith(".txt"): 
    new_file_list.append(ff) 

for files in new_file_list: 
print files 
if files == "a.txt": 
    print "=======================================" 
    file_name="/tmp/"+str(files) 
    print file_name 

    f = fileinput.FileInput(file_name, inplace=1) 

    print "=======================================" 
    for line in f: 
     line = line.replace("hellohello","hello") 
     print line, 
    f.close() 
+0

謝謝!錯過了 – 2012-02-16 09:53:12

1

不能寫入文件中的字符串。最簡單的解決方案是將文件讀入內存,替換文本然後將其寫回。

with open('file_name') as f: 
    text = f.read() 

text = text.replace('hellohello', 'hello') 

with open('file_name', 'w') as f: 
    f.write(text) 
+0

着它可以按我所指出above.Also是它有可能有每個時間,即只有一個操作的代碼完成,「R」,「W」或「A」 – Rajeev 2012-02-16 08:56:43

+0

隨着與Python 2.6我相信 – Rajeev 2012-02-16 09:01:43

1

最簡單的方法就是從文件中讀取所有數據,執行替換,然後將新數據寫入文件。

這裏是你看起來是試圖做一些示例代碼:

filename = "/tmp/a.txt" 
with open(filename, 'r') as f: 
    data = f.read() 
with open(filename, 'w') as f: 
    f.write(data.replace("hellohello", "hello")) 
+0

不能不能做到按我所指出above.Also是它有可能有每個時間,即只有一個操作的代碼,「R」,「W」或「A」 – Rajeev 2012-02-16 08:56:56

+0

還與帶有python2。 6我相信 – Rajeev 2012-02-16 09:01:57

0

另一種讀取整個文件,然後回寫你的文字,可以使用臨時文件。

你可以寫一行行到一個臨時文件,而你讀,並在結束與臨時替換您的一部開拓創新的文件:

import shutil 

filename = 'a.txt' 
temp = 'copy.tmp' 
with open(filename, 'r') as input_file, open(temp, 'w') as output_file: 
    for line in input_file: 
     output_file.write(line.replace('hellohello','hello')) 

shutil.move(temp, filename) 
0

您應該IMO提高你的代碼真正發揮作用。首先,在處理文件時,我建議儘可能使用os模塊,而不要使用字符串連接。

所以不是:file_name="/tmp/"+str(files)你可以做os.path.join('/tmp', files)。您也可以使用name, extension = os.path.splitext(ff)獲得文件擴展名,您可以測試擴展名是否是您需要的。

也從一個角度algorithmical一點我不明白爲什麼你遍歷目錄中的所有文件,把它們放在一個列表,然後在該列表迭代再次做處理。你也可以這樣做:

for ff in os.listdir('/tmp'): 
     if os.path.splitext(ff)[1] == ".txt": 
      file_n = os.path.join('/tmp', ff) 
      with open(file_n, 'r') as file_p: 
       text = file_p.read().replace('hellohello world', 'hello world') 
      with open(file_n, 'w') as file_p: 
       file_p.write(text) 

而這應該是幾乎所有你需要的。