从无限循环中保存到文本文件

10

我目前正在使用树莓派上的无限while循环将数据写入SD卡。

file = open("file.txt", "w")
while True:
    file.write( DATA )

如果程序没有通过命令或键盘中断关闭,似乎有时file.txt并不总是会保存。是否有定期保存并确保数据被保存的方法?我正在考虑使用

open("file.txt", "a")

如何在无限循环中安全地存储数据?是否有更好的方式,而不是将数据追加到文件中并定时关闭文本文件,然后再次打开它?


你能否尝试一下将缓冲选项设置为0,看看是否有任何不同?它可以作为第三个参数传递,fileTest = open("file.txt", "a", 0)。请不要使用内置名称“file”来执行操作。请使用其他变量名。 - Sukrit Kalra
2
file.flush() 会确保数据被写入。但是你真的应该捕获异常并正确关闭文件。 - James Thiele
这并不是真正停止程序的异常。当我想停止捕获数据并将数据移动到其他地方时,我需要停止程序,这就是数据没有保存的原因。我会尝试刷新并查看发生了什么。 - d.mc2
4个回答

15

文件的 write() 方法并不一定将数据写入磁盘。您需要调用 flush() 方法来确保这种情况发生...

file = open("file.txt", "w")
while True:
    file.write( DATA )
    file.flush()

不用担心对 os.fsync() 的引用 - 即使实际上没有写入磁盘,操作系统也会假装数据已经被写入了。

该死!我总是低估Python。我写了一个会定期向磁盘写入的函数,现在发现Python自动完成这项工作... - Prinsig

2
使用with语句 -- 它会确保文件自动关闭!
with open("file.txt", "w") as myFile:
    myFile.write(DATA)

本质上,这个 with 语句在这种情况下所做的是:

try:
    myFile = open("file.txt", "w") 
    do_stuff()

finally:
    myFile.close()

向您保证文件将被关闭,并且写入文件的信息将被保存。

关于with语句的更多信息可以在这里找到:PEP 343


1
如果程序异常退出,则有时文件不会被正确关闭。每次写入后打开和关闭文件也无法解决这个问题,因为在文件打开时仍有可能中断程序。类似于“立即离开,有火灾了,自救吧”的CTRL-C方法相当低级。如果要干净地关闭文件,请在代码中加入中断语句,这样您就可以优雅地处理关闭。

0
关闭文件并将代码重新写入文件。 尝试选择a+模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接