为什么只在从终端呼叫时才能将文本写入文件?

时间:2019-05-11 03:16:26

标签: python terminal raspberry-pi

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

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

4 个答案:

答案 0 :(得分:4)

Python buffers file writes by default.这样做是出于性能目的。每次Python写入文件(或OS控制的IO流,如STDOUT)时,它都必须暂停执行并将控制权移交给OS。如果操作系统正忙于执行其他操作,或者要在其中写入数据的磁盘正忙于执行其他操作,则您可能需要等待很长时间才能获得响应。 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

答案 1 :(得分:2)

写入文件的最佳做法是使用with,它将自动关闭并释放文件。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

通过显式打开文件

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")