问题描述
我的问题是关于具有 open
模式的 Python 内置 a+
函数。首先,从 this thread,我知道对于 a+
模式,对文件的后续写入将始终以文件的当前结尾结束。我编写了以下简单程序来确认这一事实:
file = 'test0.txt' # any non-empty text file
with open(file,'a+',encoding='utf-8') as f:
f.seek(0)
f.write('added')
# print(f.tell())
cc = f.readlines() # strange!
print(cc)
是的,即使通过 'added'
方法强制流定位在文件的开头,seek()
也会附加到末尾。
我认为 cc
应该是 []
,因为流位于文件的末尾。然而,这是错误的!结果是:
cc
显示附加 added
之前的所有文本。此外,切换到注释 f.seek(0)
或切换到取消注释 print(f.tell())
使事情变得正常:c
变成了 []
正如预期的那样。对我来说,这意味着 tell()
确实改变了一些东西——不仅仅是报告位置——在这种情况下。如果有人能告诉我这背后的逻辑,我将不胜感激。
解决方法
此类示例非常依赖于实现,如果您想获得确切答案,则必须深入研究源代码。
实际上,您正试图以不希望的顺序使用这些方法来获得不希望的结果。我知道我没有在这里提供关于为什么会发生这种情况的解决方案,但这里是之前提出的一些问题,他们仍然没有真正提供您所寻求的详细解释。
总而言之,做我的客人,继续阅读源代码,了解幕后发生的事情并向我们解释问题所在。如果您认为这会花费很多时间(我从经验中知道),请按顺序使用这些方法,并避免歧义和不受欢迎的行为。就像@Blckknght 说的,除非你愿意把它扑灭,否则不要玩火。
归根结底,如果仔细检查,这实际上可能是一个安全问题,但我怀疑,因为您没有溢出任何内容或覆盖到意外的地方,因为对此类操作有各种检查和控制。
Python 3 tell() gets out of sync with file pointer in append+read mode