【问题标题】:Writing into a file then reading it on Python 3.6.2写入文件然后在 Python 3.6.2 上读取它
【发布时间】:2017-08-17 09:14:15
【问题描述】:
target=open("test.txt",'w+')
target.write('ffff')
print(target.read())

运行以下python脚本时(test.txt是一个空文件),它会打印一个空字符串。

但是,当重新打开文件时,它可以正常读取:

target=open("test.txt",'w+')
target.write('ffff')
target=open("test.txt",'r')
print(target.read())

这会根据需要打印出 'ffff'。

为什么会这样? 'target' 是否仍然被识别为没有内容,即使我在第 2 行更新了它,我必须重新分配 test.txt 给它?

【问题讨论】:

  • 您忘记close() 文件。这会将数据刷新到文件中。
  • 那个,否则你必须倒带文件。取决于你想要达到的目标。
  • @Jean-FrançoisFabre:潮红与这有什么关系?它是相同的文件对象,相同的文件句柄,相同的进程。如果需要,读取将在缓冲区中找到数据。
  • @MartijnPieters 在第二条评论中更正。但目前尚不清楚 OP 想要做什么。关闭并阅读或倒带阅读。
  • @Jean-FrançoisFabre:他们希望能够读取已写入文件的数据,而无需重新打开。

标签: python file


【解决方案1】:

一个文件有一个读/写位置。写入文件将该位置置于写入文本的末尾;读取从同一位置开始。

seek method将该位置放回到开头:

with open("test.txt",'w+') as target:
    target.write('ffff')
    target.seek(0)  # to the start again
    print(target.read())

演示:

>>> with open("test.txt",'w+') as target:
...     target.write('ffff')
...     target.seek(0)  # to the start again
...     print(target.read())
...
4
0
ffff

数字是target.write()target.seek()的返回值;它们是写入的字符数和新位置。

【讨论】:

    【解决方案2】:

    无需关闭并重新打开它。您只需要在阅读之前回到文件的起点:

    with open("test.txt",'w+') as f:
        f.write('ffff')
        f.seek(0)
        print(f.read())
    

    【讨论】:

      【解决方案3】:

      尝试刷新,然后寻找文件的开头:

      f = open(path, 'w+')
      f.write('foo')
      f.write('bar')
      f.flush()
      f.seek(0)
      print(f.read())
      

      【讨论】:

      • 冲洗是不需要。这是同一个进程,同一个文件句柄。
      【解决方案4】:

      您必须先close() 才能阅读该文件。您不能同时读取和写入文件。这会导致不一致。

      【讨论】:

      • 这是废话。文件 I/O 层也知道如何从缓冲区中读取。您需要做的就是了解文件位置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 2016-06-11
      • 2023-04-02
      • 1970-01-01
      • 2021-12-05
      • 2021-06-16
      相关资源
      最近更新 更多