Jav*_*ier 8 python file-io file
我正在写一个待办事项列表程序.它使每行保存一个文件,并允许用户添加或删除项目.问题是,由于某种原因,即使正确删除了项目,我最终会在文件的开头有很多零字节.我会告诉你一些截图,以确保我清楚自己.
在运行程序之前,这是Notepad ++中的文件:
普通待办事项列表http://img683.imageshack.us/img683/2812/beforew.png
这是删除第3项后的文件(从1开始计算):
第3项已经消失,但有NUL字节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()
Run Code Online (Sandbox Code Playgroud)
你能指出哪里出错了吗?
它看起来像你忘了倒回文件流.之后f.truncate(0),添加f.seek(0).否则,我认为你的下一次写入将尝试从你离开的位置开始,在那里填充空字节.
(请注意,示例中的空字符数等于已删除行中的字符数加上每个字符的回车符和换行符.)
从Python手册:
file.truncate([size])
截断文件的大小.如果存在可选的大小参数,则文件将截断为(最多)该大小.大小默认为当前位置.当前文件位置未更改.请注意,如果指定的大小超过文件的当前大小,则结果取决于平台:可能包括文件可能保持不变,增加到指定大小,就像零填充一样,或者使用未定义的新内容增加到指定大小.可用性:Windows,许多Unix变种.
您正在截断文件,然后在文件的前一端写入item1和item2.之前的所有内容都以0字节填充.
f.seek(0)
Run Code Online (Sandbox Code Playgroud)
在截断后调用此方法重置文件位置.