2010-05-04 97 views
42

我有我想在Python中擦除的文本文件。我怎麼做?如何在Python中擦除文本文件的文件內容?

+2

Python _and_ C++?爲什麼?你可以在一箇中完成它,而你可以在另一箇中完成它 - 但是如果選擇了這個選擇,那麼使用Python會更容易。 – wilhelmtell 2010-05-04 21:23:39

+0

已經給出答案的人已經說過這是不可能的..所以你想告訴我如何輕鬆地在Python中做到這一點? – Hick 2010-05-04 21:25:30

回答

118

在蟒蛇:

open('file.txt', 'w').close() 

或者,如果你已經打開的文件:

f = open('file.txt', 'r+') 
f.truncate() 

在C++中,你可以使用類似的東西。

+0

'#包括',然後'std :: ofstream(「file.txt」);'關於就像在Python中一樣短。 :) – wilhelmtell 2010-05-04 21:44:35

+4

這個工作原因(在C++和python中)是因爲默認情況下,當您打開一個文件進行寫入時,它會截斷現有內容。所以實際上這是一種副作用,因此爲了清晰起見,我寧願顯式調用truncate(),即使它不是必需的。 – rmeador 2010-05-04 22:05:44

+6

如果您已經使用「r +」打開文件,則爲「如果您已經打開文件」 – lajarre 2012-10-04 12:49:02

0

由於文本文件是連續的,所以不能直接刪除它們上的數據。您的選項有:

  • 最常見的方法是創建一個新文件。從原始文件中讀取並在新文件上寫入除了要擦除的部分以外的所有內容。當所有文件都被寫入時,刪除舊文件並重命名新文件,使其具有原始名稱。
  • 您也可以從要更改的點開始截斷並重寫整個文件。尋求指出你想要改變,並將其餘的文件讀入內存。找回相同的點,截斷文件,然後回寫沒有要擦除的部分的內容。
  • 另一個簡單的選擇是用另一個長度相同的數據覆蓋數據。爲此,尋求確切的位置並寫入新的數據。限制是它必須具有完全相同的長度。

看那seek/truncate功能/方法來實現上述任何想法。 Python和C都有這些功能。

+0

我只是想從開始擦除整個文件 – Hick 2010-05-04 21:23:30

+2

然後只是刪除文件。在python中使用'os.remove'或'os.unlink',或者在C中使用'unlink'。012ff另一種選擇是重新打開文件進行寫入或使用'truncate'。 – nosklo 2010-05-04 21:30:34

0

除非需要擦除結尾,否則無法從文件中「擦除」。要麼滿足於覆蓋「空」值,要麼讀取您關心的文件的各個部分,並將其寫入另一個文件。

+0

確定如何覆蓋它而不提供垃圾值?我的意思是假設一個字符串長度爲9,並且我用6的字符串長度覆蓋它。那將意味着3個垃圾值rt? – Hick 2010-05-04 21:24:37

+0

正確。另外,你必須有一些方法來識別任何讀者這3個字符是垃圾的事實。 – 2010-05-04 21:28:20

+0

事實上,我的代碼跨越了python和C++。所以如果一個文件讀取完成在C + +和文件寫入蟒蛇..這兩個文件已被刪除的時間..# – Hick 2010-05-04 21:32:37

6
open("filename","w").close() 
+0

它是完美的,它正是mekasperasky正在尋找的! – Natim 2010-05-04 21:38:13

1

在您的程序中將文件指針指定爲null將僅刪除對該文件的引用。該文件仍然存在。我認爲在中的remove()函數就是你在那裏尋找的東西。不確定Python。

+1

或者在unistd.h中使用unlink()。 – Void 2010-05-04 21:43:02

+2

順便提一下,remove()和unlink()都會減少常規文件的引用計數,而不會實際刪除它。一旦參考計數下降到零,文件將被擦除。例如,如果你的進程打開了文件並且你調用了unlink()或者remove(),它將不會被刪除,直到文件關閉()d(即ref計數降到零 - 也假設沒有其他進程打開文件)。例如,爲了確保臨時文件在異常進程終止(例如open(),unlink(),執行文件IO,** CRASH **,close()NOT called)後不會被留下,這種行爲很有用。 – Void 2010-05-04 21:54:42

6

您必須覆蓋文件。在C++:

#include <fstream> 

std::ofstream("test.txt", std::ios::out).close(); 
+0

這對C++來說很好:) – Natim 2010-05-04 21:38:57

+1

不需要'close()'調用。析構函數將關閉文件。所以你只需要創建一個臨時文件:'ofstream(「test.txt」);' – wilhelmtell 2010-05-04 21:40:45

+0

我很困惑,直到我意識到原來的問題在Python和C++中都被問到了。 – user1717828 2018-02-21 16:35:06

21

不是一個完整的答案更多的延伸到ondra的答案

當使用truncate()(我的首選方法)確保你的光標位於所需的位置。 當打開一個新文件進行讀取時 - open('FILE_NAME','r')它的光標默認爲0。 但是,如果你分析你的代碼中的文件時,請務必在文件的開頭重新即truncate(0) 點默認情況下truncate()截斷從當前cusror位置開始文件的內容。

A simple example

3

從用戶@jamylak的open("filename","w").close()的另一種形式是

with open('filename.txt','w'): pass 
1

當使用with open("myfile.txt", "r+") as my_file:,我得到了奇怪的零在myfile.txt,尤其是因爲我第一次讀取文件。爲了工作,我必須首先將my_file的指針更改爲my_file.seek(0)的文件開頭。然後我可以做my_file.truncate()清除文件。

相關問題