Python写入二进制数据后调用file.flush()不生效问题问询
问题根因
这个问题和flush()方法是否生效没有关系,核心出错点是文件指针位置偏移:
- 执行
dump(l, f)写入列表数据的过程中,文件指针会同步向后移动,写入完成后指针刚好停在所有写入内容的末尾 - 此时直接调用
load(f),会从指针当前所在的末尾位置开始读取数据,自然读不到任何内容 flush()的作用仅为将内存缓冲区中未写入的内容同步到磁盘,不会修改文件指针的当前位置,它本身是正常执行完成的
修复方法
在读取数据之前调用f.seek(0),将文件指针手动移动到文件起始位置即可正常读取,修改后的参考代码如下:
from pickle import * l = [1, 2, 3, 4] f = open('file.txt', 'r+b') dump(l, f) f.flush() f.seek(0) # 将文件指针移动到文件开头 print(load(f)) # 正常输出 [1, 2, 3, 4]
补充说明
- 同一文件对象交替执行写、读操作时,切换操作前必须手动将文件指针调整到目标读取位置,否则会出现读空或者读错数据的问题
- 如果不需要继续操作文件,调用
close()关闭文件时也会自动触发缓冲区刷入磁盘的操作,和flush()的核心作用一致
内容的提问来源于stack exchange,提问作者Oleksandr Novik
相关产品推荐
相关产品推荐

