0

我的问题是关于带有模式的 Python 内置open函数。a+首先,从这个线程中,我知道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()在这种情况下确实改变了一些东西——不仅仅是报告职位。如果有人能告诉我这背后的逻辑,我将不胜感激。

4

1 回答 1

0

此类示例非常依赖于实现,如果您希望获得准确的答案,则必须深入研究源代码。

实际上,您正试图以不希望的顺序使用这些方法来获得不希望的结果。我知道我没有在这里提供关于为什么会发生这种情况的解决方案,但是这里有一些之前提出的问题,但他们仍然没有你所寻求的详细解释。

总而言之,做我的客人,继续阅读源代码,了解幕后发生的事情并解释我们的问题是什么。如果您认为这会花费很多时间(我从经验中知道),请按应有的顺序使用这些方法,并避免模棱两可和不良行为。就像@Blckknght 所说,除非您愿意将其扑灭,否则不要玩火。

归根结底,如果仔细检查,这实际上可能是一个安全问题,尽管我怀疑你没有溢出任何东西或覆盖到意想不到的地方,因为对此类操作有各种检查和控制。

奇怪的文件搜索行为

Python 3 tell() 在追加+读取模式下与文件指针不同步

于 2021-03-14T21:28:41.553 回答