您的位置:首页 > 编程语言 > Python开发

9.7Python文件操作(7):使用pickle进行二进制IO

2018-03-13 12:23 399 查看
@概述

通常的文件读写要么是读入/写出字符,要么是读入/写出字节;

而二进制IO是指直接是读入/写出Python数据类型的值;

二进制IO可以给小规模的数据读写带来极大的便利;

其底层原理,仍是某种形式的对象到字节的“编码”,以及字节到对象的“解码”;

对文件进行二进制IO时,文件的打开方模式必须是字节读写模式;

我们习惯上将存储二进制IO数据的文件以.dat后缀命名;

pickle是系统标准库所提供的二进制IO模块;

通过pickle.dump(data,outfile)和pickle.load(infile)我们可以方便地写出和读入Python对象;

@序列化 / 卸载

- 在二进制IO中,写出称为序列化(即将Pytho对象转为字节),又称为卸载;

- 下面的例子演示了向1.dat中写入整型、浮点型、布尔型、以及列表类型的Python数据对象:

# 卸载,序列化
outfile = open(r"../res/1.dat","wb")
pickle.dump(123,outfile)
pickle.dump(45.6,outfile)
pickle.dump(True,outfile)
pickle.dump(["fuck","shit","welcome"],outfile)
outfile.close()


@反序列化 / 加载

- 在二进制IO中,读入称为反序列化(即将字节转为Pytho对象),又称为加载;

- file.load(infile)每次加载一条当初写出的数据,能够load的次数和当初dump的次数是相等的;

- 下面的例子演示了从1.dat中读入当初写出的Python数据对象:

# 加载,反序列化
infile = open(r"../res/1.dat", "rb")
print(pickle.load(infile))
print(pickle.load(infile))
print(pickle.load(infile))
print(pickle.load(infile))
infile.close()


@EOFError文件末尾错误

全称为End Of File Error,即文件末尾错误;

对于一个二进制IO写出的文件,当初进行了几次dump,则读入时只能对应几次load的动作;

如果load次数已经达到当初dump写出的次数,再继续load系统就会抛出EOFError;

如果既要保证load完所有数据,又要保证程序不崩溃,我们可以结合死循环和try-except来编码;

# 卸载,序列化
outfile = open(r"../res/1.dat", "wb")
pickle.dump(123, outfile)
pickle.dump(45.6, outfile)
pickle.dump(True, outfile)
pickle.dump(["fuck", "shit", "welcome"], outfile)
outfile.close()

# 加载,反序列化
infile = open(r"../res/1.dat", "rb")
try:
while True:
print(pickle.load(infile))
except EOFError:
print("读你妹啊")

# 异常捕获后的代码仍可以正常向下执行
print("领取五毛")
infile.close()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: