2

我正在尝试以下 python seek()/tell() 函数。“input.txt”是一个包含 6 个字母的文本文件,每行一个:

a
b
c
d
e
f
text = " " 
with open("input.txt", "r+") as f:   
  while text!="":
    text = f.readline()
    fp = f.tell()
    if text == 'b\n':
      print("writing at position", fp)
      f.seek(fp)
      f.write("-")

我原以为字母“c”会被覆盖为“-”,但我却像这样附加了破折号,尽管打印上写着“在位置 4 写入”:

a
b
c
d
e
f-

当我交换 readline() 和 tell() 时输出是正确的(“b”将被“-”替换):

text = " "
with open("input.txt", "r+") as f:
  while text!="":
    fp = f.tell()           # these 2 lines
    text = f.readline()     # are swopped
    if text == 'b\n':
      print("writing at position", fp)
      f.seek(fp)
      f.write("-")

可以帮助解释为什么前一种情况不起作用?谢谢!

4

1 回答 1

3

您需要flush()将缓冲区写入磁盘,因为write发生在内存中的缓冲区而不是磁盘上的实际文件中。

在第二种情况下,在readline()您调用f.tell()which 实际上是将缓冲区刷新到磁盘之前。

text = " " 
with open("input.txt", "r+") as f:   
  while text!="":
    text = f.readline()
    fp = f.tell()
    if text == 'b\n':
      print("writing at position", fp)
      f.seek(fp)
      f.write("-")
      f.flush() #------------->
于 2021-07-05T04:31:45.727 回答