代码之家  ›  专栏  ›  技术社区  ›  DCR

Python readline()错误,写在eof

  •  0
  • DCR  · 技术社区  · 11 月前

    在python3中,readline()方法似乎有一个错误。

    我有一个文件txt.txt,其中包含两行:

    1234567890
    abcdefghij
    

    然后我运行以下代码:

    g = open("txt.txt","r+")
    g.write("xxx")
    g.flush()
    g.close()
    

    它会按预期修改文件:

    xxx4567890
    abcdefghij
    

    然后我运行以下代码:

    g = open("txt.txt","r+")
    g.readline()    
    Out[99]: 'xxx4567890\n'
    g.tell()
    Out[100] 12
    g.write("XXX")
    g.flush()
    g.close()
    I get the following:
    
    xxx4567890
    abcdefghij
    XXX
    

    为什么将“XXX”写入文件末尾,而不是第一行之后?

    如果我运行以下操作:

    g = open("txt.txt","r+")
    g.readline()    
    Out[99]: 'xxx4567890\n'
    g.tell()
    Out[100] 12
    g.seek(12)
    g.tell()
    g.write("XXX")
    g.flush()
    g.close()
    

    我明白:

    xxx4567890
    XXXdefghij
    XXX
    

    这似乎是readline()中的一个错误——它说光标在12,但在EOF处写入,除非我使用seek()

    我正在使用Spyder作为IDE在窗口11上运行所有这些。有人建议停止缓存,但我不知道该怎么做。在Spyder中启动之前,我确实删除了所有变量

    1 回复  |  直到 11 月前
        1
  •  2
  •   user2722968    11 月前

    您正在“文本模式”下使用文件(否 b 在中 mode 参数)。 The docs state

    f.tell()返回一个整数,给出文件对象在文件中的当前位置,表示为二进制模式下从文件开头开始的字节数,以及 在文本模式下为不透明数字 .

    这是一个错误的期望 f.tell() 返回 12 表示实际文件光标当前位于字节位置 12 .

    实际发生的情况是,在第一个 f.readline() ,但只有线路本身从呼叫中返回;已经读取的其余内容正在后台缓冲,并且文件光标已经被推到了最远的位置。