当你使用python 的 open函数打开一个文件并向其中写入数据时,数据并不会立即落入磁盘,而是在缓冲区缓存,何时写入磁盘,是由buffering参数决定的。这样做是为了减少磁盘的写入次数,等到数据积累到一定量时一次性写入到磁盘。
程序中实行flush可以强制将缓冲区的数据写入到磁盘,文件在close时也会将缓冲区里的数据写入到磁盘。
一般来说,我们不关心缓冲区的缓冲大小和策略,但特殊情况下,你可以使用buffering参数进行设置。
buffering 的取值只有 -1, 0, 1 , > 1 四种取值,对于本文文件和二进制文件,也有着不同的策略。
文件类型 | buffering=-1 | buffering=0 | buffering=1 | buffering > 1 |
---|---|---|---|---|
二进制 | io.DEFAULT_BUFFER_SIZE | 禁止缓存 | 1 | buffering |
文本 1 | io.DEFAULT_BUFFER_SIZE | 不允许设置为0 | line buffering | io.DEFAULT_BUFFER_SIZE |
二进制文件可以通过设置buffering=0 禁止缓存,而文本文件不可以禁止缓存,文本文件要么设置为行缓存,要么设置缓存区大小为io.DEFAULT_BUFFER_SIZE。
文本文件写入时,设置缓存策略为行缓存,每写入一行数据,就会同步到磁盘上,下面这个程序可以验证
import time
with open('./test.txt', 'w', buffering=1)as f:
for i in range(10):
f.write(str(time.time()) + "\n")
time.sleep(3)
程序会运行30秒,每隔3秒钟向文件中写入一行时间,若不设置buffering等于1,在程序结束之前test.txt里不会有任何数据写入,io.DEFAULT_BUFFER_SIZE大小是8192,程序写的数据还远远不够。但由于设置了行缓存策略,因此每写一行就会同步一行,在test.txt文件里每隔3秒钟就会出现一行新的数据。
QQ交流群: 211426309