我在Python中获得了这个简单的代码,该代码将“ abc”写入文本文件test.txt
。现在,在Raspberry上使用IDLE执行此代码,否则Thonny不起作用,文本文件将保持为空...但是,当使用终端进行调用时,它将文本写入文件中。有人可以帮忙吗?
f = open("test.txt","w")
f.write("abc")
答案 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")