欢迎光临
我们一起进阶

Python文件操作——使用pickle进行二进制IO

扫码或搜索:沉默王二
发送 290992
即可立即永久解锁本站全部文章

概述

通常的文件读写要么是读入/写出字符,要么是读入/写出字节;
而二进制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()

赞(1) 打赏
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

小白学堂,学的不止是技术,更是前程

关于我们免责声明

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏