【问题标题】:Why write a text to file only works when call from terminal?为什么将文本写入文件仅在从终端调用时才有效?
【发布时间】:2019-09-28 21:52:01
【问题描述】:

我在 Python 中得到了这个简单的代码,它将“abc”写入一个名为 test.txt 的文本文件中。现在,在 Raspberry 上使用 IDLE 执行此代码或 Thonny 不起作用,文本文件仍然为空......但是,当使用终端调用时,它会将文本写入文件中。有人可以帮忙吗?

f = open("test.txt","w") 
f.write("abc")

【问题讨论】:

  • 如果写在一行上,无论如何都是语法错误。可能您在读取文件之前终止了终端。这会触发文件缓冲区的刷新和文件的关闭(最好在代码中明确完成)。
  • 嘿,我刚刚编辑了代码,当然是两行写的

标签: python terminal raspberry-pi


【解决方案1】:

Python buffers file writes by default. 这样做是出于性能目的。每次 Python 写入文件(或操作系统控制的 IO 流,如 STDOUT)时,它都必须暂停执行并将控制权交给操作系统。如果操作系统正忙于做其他事情,或者如果您要写入数据的磁盘正忙于做其他事情,您可能会等待很长时间才能得到响应。不是每次你想写东西时都等待,Python 将数据写入内存中的缓冲区,然后承诺在缓冲区填满后最终将缓冲区的内容写入文件(称为“刷新”缓冲区的过程)。这允许您的程序立即继续执行。

使用写缓冲区的风险在于,如果您的程序在缓冲区刷新到磁盘之前崩溃,您会丢失该数据。此外,如果一个程序写入缓冲区并以这种方式继续执行,则无法保证并发运行的程序会在磁盘上看到该数据,直到第一个程序以某种方式刷新缓冲区。第二种情况是您的示例中发生的情况:IDLE 正在运行一个写入缓冲区的 Python 进程,并且您正在运行第二个并发进程以在 IDLE 仍在运行时检查文件。因为缓冲区在 IDLE 中没有被刷新,所以您将看不到任何写入。当您从终端运行程序时不会发生这种情况,因为那里的 Python 进程终止,而当进程终止时执行的清理任务之一是刷新所有写入缓冲区。

有很多方法可以强制刷新缓冲区。 Python flushes write buffers automatically when files are closed,你可以试试:

f = open("test.txt", "w")
f.write("abc")
f.close()

在 Python 中打开文件的首选方法是使用 with statement context manager。当执行退出with 块时,with 语句中创建的变量被告知要清理它们自己,这对于文件来说意味着关闭它们。所以你可以试试:

with open("test.txt", "w") as f:
    f.write("abc")  # after this block, f is flushed and closed

如果您想保持文件打开并手动刷新写入缓冲区,Python 会为您提供flush method,因此您也可以编写:

f = open("test.txt", "w")
f.write("abc")
f.flush()  # f remains open

最后,您可以通过传递buffering argument to open 来告诉 Python 使用与操作系统默认大小不同的缓冲区。 0 的值告诉 Python 在每次写入磁盘时立即刷新。所以你可以这样做:

f = open("test.txt", "w", buffering=0)
f.write("abc")  # f remains open

【讨论】:

    【解决方案2】:

    当您通过执行显式打开文件时

    f = open("test.txt","w") 
    f.write("abc")
    

    您需要确保在最后通过执行f.close() 关闭文件,否则您写入文件的数据不会刷新到文件中,无论您在哪里运行代码从,所以代码将是

    f = open("test.txt","w") 
    f.write("abc")
    #Close the file
    f.close()
    

    您的另一个选择是使用诸如with 之类的上下文管理器打开文件,一旦上下文管理器结束,它会自动关闭文件

    with open("test.txt","w") as f:
        f.write("abc")
    

    【讨论】:

      【解决方案3】:

      写文件的最佳做法是使用with,它会自动关闭和释放你的文件。

      with open("test.txt","w") as f:
          f.write("abc")
      

      【讨论】:

        【解决方案4】:

        尝试在代码末尾调用 f.close() 吗?

        【讨论】:

          猜你喜欢
          • 2017-11-12
          • 2021-07-28
          • 1970-01-01
          • 2021-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-26
          相关资源
          最近更新 更多