当新手(像我一样)要求在 python 中读取/处理文本文件时,他经常得到如下答案:
with open("input.txt", 'r') as f:
for line in f:
#do your stuff
现在我想在特殊行之后截断我正在阅读的文件中的所有内容。修改上面的示例后我使用:
with open("input.txt", 'r+') as file:
for line in file:
print line.rstrip("\n\r") #for debug
if line.rstrip("\n\r")=="CC":
print "truncating!" #for debug
file.truncate();
break;
并期望它在看到第一个“CC”后丢弃所有内容。在 input.txt 上运行此代码:
AA
CC
DD
以下内容打印在控制台上(如预期):
AA
CC
truncating!
但文件“input.txt”保持不变!?!?
怎么可能?我做错了什么?
Edit:操作后我希望文件包含:
AA
CC
看起来您正在成为 Python 内部使用的预读缓冲区的受害者。来自file.next() 方法的文档:
例如,文件对象是它自己的迭代器iter(f)
返回 f(除非 f 已关闭)。当文件用作迭代器时,通常在for
循环(例如,for line in f: print line.strip()
), the next()
方法被重复调用。此方法返回下一个输入行,或引发StopIteration
当打开文件进行读取时命中 EOF(打开文件进行写入时,行为未定义)。为了制作一个for
循环 循环文件行的最有效方法(一种非常常见的操作),next()
方法使用隐藏的预读缓冲区。由于使用预读缓冲区,结合next()
与其他文件方法(例如readline()
)无法正常工作。然而,使用seek()
将文件重新定位到绝对位置将刷新预读缓冲区。
结果是文件的位置不是您截断时所期望的位置。解决这个问题的一种方法是使用readline循环文件而不是迭代器:
line = file.readline()
while line:
...
line = file.readline()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)