代码之家  ›  专栏  ›  技术社区  ›  Javier

用python写入文件会插入空字节

  •  8
  • Javier  · 技术社区  · 14 年前

    我正在写一个待办事项列表程序。它保存一个文件,每行有一件事要做,并允许用户添加或删除项目。问题是,由于某种原因,我最终在文件开头得到了大量的零字节,即使该项被正确地删除了。我会给你看几张截图,以确保我把自己弄清楚。

    这是在运行程序之前记事本++中的文件:

    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()
    

    你能指出哪里出错了吗?

    3 回复  |  直到 14 年前
        1
  •  9
  •   ʇsәɹoɈ    14 年前

    在我看来,你好像忘了倒带文件流。后 f.truncate(0) ,添加 f.seek(0) . 否则,我认为您的下一篇文章将尝试从您离开的位置开始,在到达该位置时填充空字节。

    (请注意,示例中的空字符数等于已删除行中的字符数加上每个字符的回车符和换行符。)

        2
  •  6
  •   John Kugelman dbush    14 年前

    Python manual :

    file.truncate([size])
    截断文件的大小。如果可选 大小 参数存在,文件被截断到(最多)该大小。大小默认为当前位置。 当前文件位置未更改。 请注意,如果指定的大小超过了文件的当前大小,则结果取决于平台:可能的情况包括:文件可能保持不变,增加到指定的大小(如零填充),或增加到指定的大小(新内容未定义)。可用性:Windows,许多UNIX变体。

    您正在截断文件,然后在文件的前一端写入项1和项2。之前的所有内容都用0字节填充。

    f.seek(0)
    

    调用此函数可在截断后重置文件位置。

        3
  •  3
  •   S.Lott    14 年前

    接受提示。不要这样做。

    在过去的日子里(30年前——严肃地说),我们用复杂的添加/更改/删除逻辑“更新”文件。

    现在,如果你写的程序

    1. 将整个文件读取到内存中。

    2. 处理内存中的对象。

    3. 定期将对象写入文件,并在用户希望保存时将其写入。

    它更快更简单。使用 pickle 将对象转储到文件。不要弄乱“记录”或试图“就地”更改文件。

    如果您真的认为您需要SQL功能(插入、更新、删除),那么使用sqlite。它比你想做的更可靠。