文件缓冲
文件缓冲
在使用open()创建一个文件对象的时候,默认情况下会启用缓冲。在open()中提供的buffering参数描述的就是文件处理缓冲的定义,在进行文件写入的时候利用缓冲可以避免频繁的I/O资源占用。
开启缓冲可以提高写入效率,buffering参数设置有3种类型:
- 全缓冲(buffering > 1):当标准I/O缓存被填满后才会进行真正I/O操作,全缓冲的典型代表就是对磁盘文件的读写操作。
- 行缓冲(buffering = 1):在文本I/O操作中遇见换行符时执行输出,例如文本文件的行缓冲写入。
- 不缓冲(buffering = 0):直接进行I/O操作,数据不经过缓冲保存;此设置只适用于二进制模式。
如果想要观察到行缓冲的使用特点,就不能直接使用with语句,因为with最后会执行close()的关闭操作,而一旦关闭,则缓冲的内容会全部进行输出。
使用flush()进行缓冲区的强制清空,一旦强制清空之后,缓冲区的内容将全部输出。每次使用close()关闭文件流的时候默认情况下也会调用flush()进行缓冲区的清空处理。
文件缓冲
import os
file = open(file="data.txt", mode="w", encoding="utf-8", buffering=1)
file.write("This is a test.")
os.system("pause")
file.flush()
os.system("pause")
file.close()运行结果:data.txt
This is a test.互动实验
把字符送过缓冲区
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
行缓冲文本流没有关闭或手动刷新时,哪次写入会触发行输出?
知识测验
题目
关闭文件时,缓冲区还有未输出的数据,一般会怎样?
动手练习
字符何时离开缓冲区?
使用八字节ASCII全缓冲教学模型,文件初始为空。依次写ABC、DE、FGH、IJ,再调用flush(),列出每步等待内容、文件输出和批次数;再与行缓冲、不缓冲二进制写入比较。本模型没有额外自动刷新。
另追踪行缓冲的write('CAT')、write('\n')、write('DOG')、close(),关闭前DOG必须带换行吗?