为什么要将open函数的buffersize更改为0,以防止在python中写入文件时丢失数据?

为什么要将open函数的buffersize更改为0,以防止在python中写入文件时丢失数据?,python,Python,我使用以下代码将数据写入文件: fr = open('filename', 'w') for x in lines: #lines is a list with about 10k numbers f.write(str(x) + ' ') 最后一行或最后一行的数据有时会丢失,但我将buffersize更改为0,这意味着将代码修改为fr=open('filename','w',0),不会丢失数据。为什么要使用此参数?buffersize参数的用途是什么?是否有其他防止丢失的方法?缓冲区

我使用以下代码将数据写入文件:

fr = open('filename', 'w')
for x in lines: #lines is a list with about 10k numbers
    f.write(str(x) + ' ')

最后一行或最后一行的数据有时会丢失,但我将buffersize更改为0,这意味着将代码修改为
fr=open('filename','w',0)
,不会丢失数据。为什么要使用此参数?buffersize参数的用途是什么?是否有其他防止丢失的方法?

缓冲区意味着数据不会立即写入磁盘上的文件,而是存储在大小为x的内存缓冲区中。当缓冲区已满时,系统会将内容刷新到文件中,也就是说,当实际内容写入磁盘上的文件时。 将内容刷新到磁盘的另一种情况是“关闭”文件。 但是,当您将缓冲区设置为大小为0(零)时,内容不会进入内存,而是直接(或多或少)写入文件。 这就是为什么当您在循环结束时关闭文件,或者将缓冲区设置为0时,您拥有所有数据。但是当你没有关闭,缓冲区是正的-你的最后一行数据挂在内存中,但没有写入(刷新)到磁盘,你有一行丢失。 一个好的做法是使用python的“with”关键字打开一个文件——使用这个关键字,您的文件将自动关闭,所有内容将刷新(写入)到磁盘

例如:

with open('filename', 'w') as fr:
     for x in lines:
         fr.write(str(x) + ' ')

你最后关闭了文件吗?@JoeC没有,我发现有些人说关闭与否没有区别,他们只是建议将buffersize改为0;我没有测试它。好吧,试一试,只需在循环后添加一行,
fr.close
@JoeC我刚才测试了它,奇怪的是,没有参数0或
fr.close()
现在就没有数据丢失!因此,我无法判断
fr.close()
是否有效。显式
fr.flush()
调用或隐式flush on
fr.close()
(由
with
-语句调用)不直接写入磁盘,调用只刷新库缓冲区,操作系统可能会延迟写入磁盘。除非发生电源故障(),否则这不是问题。