2017-01-12 64 views
2

這些都是contacts.txt文件的內容:嘗試 'A +' 閱讀並同時追加,但沒有奏效

富69

酒吧70

巴茲71

我要刪除「富69」,這是我做過什麼:

with open('contacts.txt','a+') as f: 
    for line in f: 
     with open('contacts.txt','a+') as f: 
      if "foo" in line: 
       line.replace("foo", "") 

它沒有做任何事。

+0

刪除整行或只是foo? – depperm

+2

'line'是一個字符串,調用'line.replace(「foo」,「」)''''''但實際上並不影響字符串,因爲函數沒有發生。即使這樣做,它也不會將其寫回文件。 –

+0

@hiroprotagonist好吧我將它存儲在一個變量中並寫入文件。現在結果是相同的文本文件,但最後是「69」。 –

回答

2

正確的方法是先完全閱讀內容,讓您的修改,然後寫回文件。

這種方法乾淨可讀。

#first read everything 
with open('file_name','r') as f: 
     content = f.read() 

#now perform modifications 
content = content.replace('foo 69','') 

#now write back to the file 
with open('file_name','w') as f: 
     f.write(content) 

現在,我已經評論了一些你在你的代碼有問題:

with open('file_name','a+') as f: 
    for line in f:#here you are iterating through the content of the file 
     # at each iteration line will equal foo 69, then bar 70 and then bar 71... 

     # Now, there is no reason to open the file here again, I guess you opened 
     # it to write again, but your mode is set to `a` which will append contents 
     # not overwrite them 
     with open('contacts.txt','a+') as f: 
      if "foo" in line: 
       line.replace("foo", "") #here the modified content is lost 
       # because you're not storing them anywhere 

編輯 - 正如在評論中提到的,如果你的文件是相當大的,你不這樣做想要閱讀所有的內容。

然後做到這一點,最好的辦法就是逐行讀取內容系並寫入內容到另一個文件中不包括你要刪除的行。

to_replace = 'foo 69\n' #note \n is neccessary here 
with open('input.txt','r') as input_file: 
    with open('ouput.txt','w') as output: 
     for line in input_file: 
      if line!=to_replace: 
       output.write(line) 


#Now, let's say you want to delete all the contents of the input_file 
#just open it in write mode and close without doing anything 
input_file = open('input_file.txt','w') 
input_file.close() 

# If you want to delete the entire input_file and rename output_file to 
# original file_name then you can do this in case of linux OS using subprocess 
subprocess.call(['mv', 'output_file.txt', 'input_file.txt']) 

由於在任何時間點只有一行內容在內存中,所以這非常具有內存效率。 input_file只是一個指向該文件的指針,迭代 - for line in input_file不會讀取整個文件並開始逐個迭代內容。

+1

如果文件非常大,如果您不想將所有內容加載到內存中,而是在飛行中進行修改,該怎麼辦? –

+0

@SembeiNorimaki是的,我同意這個說明。動態修改更好。但是,這裏似乎是OP有一個更小的文件。此外,做動態修改是更危險的,在這個答案中稱爲「黃蜂巢」 - http://stackoverflow.com/a/5453315/3225001 –

+0

@SembeiNorimaki我已經包含了一種方法來處理大文件回答。謝謝你讓我知道。 –

1

我不確定你想要輸出的結果是什麼樣的(例如,如果你想要刪除高於bar 70的行也是這樣),但是這段代碼只會從文件中刪除foo 69。只需要打開一個參考文件一次:

with open('contacts.txt', 'r+') as f: 
    content = f.read() 
    new_content = content.replace('foo 69', '') 
    f.seek(0) 
    f.write(new_content) 
    f.truncate() 

在下面的代碼片段,我在地方換行符用於格式化目的的使用.

contacts.txt前:

foo 69 
. 
bar 70 
. 
baz 71 

contacts.txt後:

. 
. 
bar 70 
. 
baz 71 
+0

從來不知道截斷和尋求,我是一個初學者(哎呀,我看起來像一個?)。這是我的新信息,感謝您分享!將來一定會對我有所幫助。你的代碼很有意義。 –

相關問題