我在 Python 中得到了这个简单的代码,它将“abc”写入文本文件调用test.txt
. 现在,在 Raspberry 上用 IDLE 或 Thonny 执行此代码不起作用,文本文件保持为空……但是,当使用终端调用时,它将文本写入文件。有人可以帮忙吗?
f = open("test.txt","w")
f.write("abc")
Python 默认缓冲文件写入。它这样做是出于性能目的。每次 Python 写入文件(或操作系统控制的 IO 流,如 STDOUT)时,它都必须暂停执行并将控制权交给操作系统。如果操作系统正忙于执行其他操作,或者您要写入数据的磁盘正忙于执行其他操作,您可能需要等待很长时间才能获得响应。Python 不是每次想写东西时都等待,而是将数据写入内存中的缓冲区,然后承诺在缓冲区填满后最终将缓冲区的内容写入文件(这个过程称为“刷新”缓冲区)。这允许您的程序立即继续执行。
使用写入缓冲区的风险在于,如果您的程序在缓冲区刷新到磁盘之前崩溃,您将丢失该数据。此外,如果一个程序写入缓冲区并以这种方式继续执行,则无法保证并发运行的程序会看到磁盘上的数据,直到第一个程序以某种方式刷新缓冲区。第二种情况是您的示例中发生的情况:IDLE 正在运行一个写入缓冲区的 Python 进程,并且您正在运行第二个并发进程以在 IDLE 仍在运行时检查文件。因为缓冲区没有在 IDLE 中被刷新,所以你不会看到任何写入。从终端运行程序时不会发生这种情况,因为那里的 Python 进程终止了,
有很多方法可以强制刷新缓冲区。Python 在文件关闭时自动刷新写入缓冲区,因此您可以尝试:
f = open("test.txt", "w")
f.write("abc")
f.close()
在 Python 中打开文件的首选方法是使用with
语句上下文管理器。当执行退出with
块时,with
语句中创建的变量会被告知自行清理,在文件的情况下,这意味着关闭它们。所以你可以试试:
with open("test.txt", "w") as f:
f.write("abc") # after this block, f is flushed and closed
如果要保持文件打开并手动刷新写入缓冲区,Python 为您提供了flush
方法,因此您也可以编写:
f = open("test.txt", "w")
f.write("abc")
f.flush() # f remains open
最后,您可以通过将buffering
参数open
传递给. 值0
告诉 Python 在每次写入磁盘时立即刷新。所以你可以这样做:
f = open("test.txt", "w", buffering=0)
f.write("abc") # f remains open
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句