python(pickle):序列化 、反序列化 --- pickle.dump() / pickle.dumps() / pickle.load() / pickle.loads()的使用

1、pickle序列化

pickle.dump()方法将obj对象序列化为字节(bytes)写入到file文件中

pickle.dump(obj, file, protocol=None, *, fix_imports=True)

pickle.dumps()方法将obj对象序列化并返回一个bytes对象

pickle.dumps(obj, protocol=None, *, fix_imports=True)

例:

import pickle


dict1 = dict(name='八岐大蛇',
             age=1000,
             sex='男',
             addr='东方',
             enemy=['八神', '草薙京', '神乐千鹤'])
print(dict1)
data_dumps = pickle.dumps(dict1)
print(data_dumps)
print(type(data_dumps))  # 返回的是bytes

data_file = open('dump.txt', 'wb')
pickle.dump(dict1, data_file)
data_file.close()
# 控制台输出
{'name': '八岐大蛇', 'age': 1000, 'sex': '男', 'addr': '东方', 'enemy': ['八神', '草薙京', '神乐千鹤']}
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x0c\x00\x00\x00\xe5\x85\xab\xe5\xb2\x90\xe5\xa4\xa7\xe8\x9b\x87q\x02X\x03\x00\x00\x00ageq\x03M\xe8\x03X\x03\x00\x00\x00sexq\x04X\x03\x00\x00\x00\xe7\x94\xb7q\x05X\x04\x00\x00\x00addrq\x06X\x06\x00\x00\x00\xe4\xb8\x9c\xe6\x96\xb9q\x07X\x05\x00\x00\x00enemyq\x08]q\t(X\x06\x00\x00\x00\xe5\x85\xab\xe7\xa5\x9eq\nX\t\x00\x00\x00\xe8\x8d\x89\xe8\x96\x99\xe4\xba\xacq\x0bX\x0c\x00\x00\x00\xe7\xa5\x9e\xe4\xb9\x90\xe5\x8d\x83\xe9\xb9\xa4q\x0ceu.'
<class 'bytes'>

Process finished with exit code 0

2、pickle反序列化

从一个对象文件中读取序列化数据,将其反序列化之后返回一个对象

pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict")

将bytes反序列化并返回一个对象

pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict")
data_loads = pickle.loads(data_dumps)
print(data_loads)

data_file = open('dump.txt', 'rb')
data_load = pickle.load(data_file)
print(data_load)
# 反序列化输出:
{'name': '八岐大蛇', 'age': 1000, 'sex': '男', 'addr': '东方', 'enemy': ['八神', '草薙京', '神乐千鹤']}
{'name': '八岐大蛇', 'age': 1000, 'sex': '男', 'addr': '东方', 'enemy': ['八神', '草薙京', '神乐千鹤']}

Process finished with exit code 0

3、pickle与json的区别

pickle与json都可以实现序列化以及反序列化,它们之间不同的有以下几点:

1)、pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化,只针对python的数据类型;而json可以支持更多语言的序列化和反序列化,在python中序列化一个自定义的类对象时,会抛出一个 TypeError。
2)、json的序列化输出是文本对象是str类型,而pickle序列化的输出是二进制字节-bytes。
3)、json可读性优于pickle。

猜你喜欢

转载自blog.csdn.net/darkman_ex/article/details/80752049