pyickle模块常用方法

it2026-08-04  11

pickle和json差别:

json字典value不支持其他对象只支持python原有的结构,但是json由于是转换为string,所以保存的文件是可以使用文本查看器去读取的

pickle包则支持各种python的对象,但它写入的是二进制文件,并有自己独特的编码方式,所以是不可以查看的,只能使用python载入

方法说明pickle.dumps(iterable)#内容转化成batespickle.loads(iterable)#bates 转化成人看的pickle.dump(dic,句柄)# 用于存文件pickle.load(句柄)#用于读取文件

dump和load方法实例:

import pickle dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒'], 'age': 18, 'money': '1个亿'} s1 = pickle.dumps(dic) print("s1:", s1) # 转化成Rb bate 字节类型,不过仅仅支持python 通信 dic2 = pickle.loads(s1) print("dic2:", dic2)

运行结果:

s1: b'\x80\x04\x95g\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x0c\xe5\xa4\xaa\xe7\x99\xbd\xe9\x87\x91\xe6\x98\x9f\x94\x8c\nhobby_list\x94]\x94(\x8c\x06\xe6\x88\x92\xe7\x83\x9f\x94\x8c\x0c\xe7\x83\xab\xe4\xb8\x8d\xe4\xba\x86\xe5\xa4\xb4\x94\x8c\x06\xe6\x88\x92\xe9\x85\x92\x94e\x8c\x03age\x94K\x12\x8c\x05money\x94\x8c\x071\xe4\xb8\xaa\xe4\xba\xbf\x94u.' dic2: {'name': '太白金星', 'hobby_list': ['戒烟', '烫不了头', '戒酒'], 'age': 18, 'money': '1个亿'}

dumps和loads方法实例:

import pickle dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒'], 'age': 18, 'money': '1个亿'} filename = "D:\\test\\p1.pkl" with open(filename, mode='wb') as f1: pickle.dump(dic, f1) with open(filename, mode='rb') as f2: ret = pickle.load(f2) print(ret)

运行结果:

添加了p1.pkl文件,并且将转化好的数据存进去

{'name': '太白金星', 'hobby_list': ['戒烟', '烫不了头', '戒酒'], 'age': 18, 'money': '1个亿'}

部分问题:

pickle模块的追加时写入后有一个问题,读取出来的总是第一个对象。这是因为Pickle 每次序列化生成的字符串有独立头尾,pickle.load() 只会按顺序读取一个完整的结果,所以只需要在 load 一次之后再 load 一次,就能读到第二次序列化的 对象。如果不知道文件里有多少 pickle 对象,可以在 while 循环中反复 load 文件对象,直到抛出异常为止。

代码如下:

with open(filename, mode='rb') as f: while True: try: aa = pickle.load(f) print(aa) except EOFError: break
最新回复(0)