2010-06-12 41 views
8

我正在編寫待辦事項列表程序。它爲每行保留一個文件,並讓用戶添加或刪除項目。問題在於,由於某種原因,即使該項目被正確刪除,我在文件開始時也會產生大量零字節。我會告訴你幾個截圖,以確保我清楚自己。用Python寫入文件會插入空字節

這是在記事本++文件運行程序之前:

Normal todo list http://img683.imageshack.us/img683/2812/beforew.png

這是刪除項目3(從1開始計數)之後的文件:

Item 3 is gone, but there are NUL bytes http://img190.imageshack.us/img190/9387/afterj.png

這是相關的代碼。實際的程序更大,但只運行這個部分就會觸發錯誤。

import os 
TODO_FILE = r"E:\javi\code\Python\todo-list\src\todo.txt" 

def del_elems(f, delete): 
    """Takes an open file and either a number or a list of numbers, and deletes the 
    lines corresponding to those numbers (counting from 1).""" 
    if isinstance(delete, int): 
     delete = [delete] 
    lines = f.readlines() 
    f.truncate(0) 
    counter = 1 
    for line in lines: 
     if counter not in delete: 
      f.write(line) 
     counter += 1 

f = open(TODO_FILE, "r+") 
del_elems(f, 3) 
f.close() 

請您指出錯誤在哪裏?

回答

9

它看起來像我忘了倒退你的文件流。在f.truncate(0)之後,添加f.seek(0)。否則,我認爲你的下一次寫操作會嘗試從你停止的位置開始,在那裏填寫空字節。

(注意的是,在您的示例空字符的數目等於字符數在已刪除的行加上爲每一個回車和換行字符。)

6

Python manual

file.truncate([size])
截斷文件的大小。如果存在可選的大小參數,則該文件被截斷爲(最多)該大小。大小默認爲當前位置。 當前文件位置不變。請注意,如果指定的大小超出文件的當前大小,則結果將取決於平臺:可能性包括文件可能保持不變,增加到指定的大小,就像零填充一樣,或者增加到具有未定義新內容的指定大小。可用性:Windows,許多Unix變體。

您正在截斷文件,然後在文件的前端寫入item1和item2。之前的所有內容都以0字節填充。

f.seek(0) 

調用此函數重置截斷後的文件位置。

+0

非常感謝。你的答案和森林一樣好,但我必須選擇一個接受,所以我選擇了較早的一個。與個人無關。 – Javier 2010-06-12 22:52:37

3

採取提示。不要這樣做。

在過去的日子裏(30年前 - 嚴肅地說)我們用複雜的添加/更改/刪除邏輯「更新」文件。

如今,如果你編寫的程序

  1. 將整個文件讀入內存的生活更簡單。

  2. 處理內存中的對象。

  3. 定期將對象寫入文件,並在用戶想要保存時寫入。

它更快更簡單。使用pickle將您的對象轉儲到文件。不要混淆「記錄」或嘗試更改文件「到位」。

如果你真的認爲你需要SQL功能(插入,更新,刪除),然後使用SQLite。它比你想要做的更可靠。

+1

這是爲了練習,但這是一個有趣的觀點。我會看看我是否改變它的行爲像你說的。 – Javier 2010-06-12 23:51:30