2011-05-13 25 views
4

我的程序正在爲用戶保留一個日誌。如果日誌數量超過一定數量,我想刪除前20%的行。從Python中的文件中刪除行(並保持相同的文件名)的有效方法?

從類似的問題,我已經看到了建議要讀舊文件,並寫出我想保留到一個新文件中的所有行。但是,我的文件可能太大而無法不斷地讀取它們,並且使用該方法不會讓我保留相同的文件名。

我可以在不讀取舊文件的情況下從文件中刪除行嗎?

+0

我不認爲有一種方法可以在不打開文件的情況下從文件的開頭刪除它並讀取它。如果有的話,我很想知道如何去做。 – 2011-05-13 19:11:44

+0

該方法肯定會讓你保持相同的文件名。只要閱讀它,關閉文件,然後重新打開文件。 – senderle 2011-05-13 19:12:51

+1

這些文件有多大? – inspectorG4dget 2011-05-13 19:15:12

回答

8

實現日誌文件的一般方法是'旋轉' - 當日志文件變老或達到一定大小時,重新命名並開始寫入新文件。 如果您使用的是logging模塊,甚至有一個預配置的模塊 - RotatingFileHandler可以自動執行此操作。

至於你的問題:你只能從後面截斷,而不是從頭開始。一個近似的解決方案是尋找()到文件的20%,找到第一個'\ n'並複製出來 - 但它會很慢並且容易出現競爭條件。去日誌和RotatingFileHandler。

+0

這看起來不錯,謝謝! – Sarato 2011-05-13 19:19:38

1

正如其他人所說,解決這個問題的傳統方法是保留5個不同的文件,而不是1個大的文件。當您需要刪除20%時,只需刪除最舊的文件並重命名其他文件。

就像文本文件一樣方便,你也可以考慮一個數據庫。它旨在能夠隨時刪除任何部分的數據。

0
if size > MAX_SIZE: 
    f = open(your_file, 'r') 
    lines = f.readlines() 
    f.close() 

    f = open(your_file, 'w') 
    f.write('\n'.join(lines[len(lines)/5:])) 
    f.close() 

這樣做可能。儘管如前兩個所述,如果可以的話,使用多個文件甚至數據庫要好得多。 此代碼未經測試。