【问题标题】:Writing to a file in Python inserts null bytes在 Python 中写入文件会插入空字节
【发布时间】:2010-06-12 22:32:19
【问题描述】:

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

这是运行程序之前Notepad++中的文件:

这是删除第3项后的文件(从1开始计数):

这是相关代码。实际程序比较大,但是只运行这部分会触发错误。

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

你能指出错误在哪里吗?

【问题讨论】:

    标签: python file file-io


    【解决方案1】:

    在我看来,您好像忘记了倒带文件流。在f.truncate(0) 之后,添加f.seek(0)。否则,我认为您的下一次写入将尝试从您离开的位置开始,并在途中填充空字节。

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

    【讨论】:

      【解决方案2】:

      来自Python manual

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

      您正在截断文件,然后在文件的前端写入 item1 和 item2。在此之前的所有内容都以 0 字节填充。

      f.seek(0)
      

      调用它来重置截断后的文件位置。

      【讨论】:

      • 非常感谢。你的答案和Forest的一样好,但我必须选择一个接受,所以我选择了较早的一个。没有什么私人的。
      【解决方案3】:

      接受提示。不要这样做。

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

      现在,如果您编写程序,生活会变得更简单

      1. 将整个文件读入内存。

      2. 处理内存中的对象。

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

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

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

      【讨论】:

      • 这是为了练习,但这是一个有趣的点。我看看能不能把它改成你说的那样。
      猜你喜欢
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多