"""
pickle
将python中所有的数据类型(包含set)变成字节串: 序列化过程
将字节串转换成python中数据类型: 反序列化过程
"""
import pickle
bys = pickle.dumps([1, 2, 3])
print(type(bys))
print(bys)
import pickle
bys = pickle.dumps([1, 2, 3])
print(type(bys))
print(bys)
(venv) C:\work\day16>python pickle_demo.py
<class ‘bytes‘>
b‘\x80\x03]q\x00(K\x01K\x02K\x03e.‘
bys = pickle.dumps((1, 2, 3)) # 元组
print(bys)
#
res = pickle.loads(bys) # 变回原本的数据类型元组
print(type(res))
#
(venv) C:\work\day16>python pickle_demo.py
b‘\x80\x03K\x01K\x02K\x03\x87q\x00.‘
<class ‘tuple‘>
bys = pickle.dumps(set(‘abc‘))
print(bys)
res = pickle.loads(bys)
print(type(res))
(venv) C:\work\day16>python pickle_demo.py
b‘\x80\x03cbuiltins\nset\nq\x00]q\x01(X\x01\x00\x00\x00bq\x02X\x01\x00\x00\x00aq\x03X\x01\x00\x00\x00cq\x04e\x85q\x05Rq\x06.‘
<class ‘set‘>
# 从文件中把序列化内容写入
# 当初我们在json中 打开文件的方式是 at append text模式
# 而我们现在是写入字节 理所当然 更改为 wb, 且二进制不需要encode
with open(‘c.txt‘, mode=‘wb‘) as f:
pickle.dump([1, 2, 3], f)
# 从文件中反序列化pickle
with open(‘c.txt‘, mode=‘rb‘) as f:
res = pickle.load(f)
print(type(res))
print(res)
(venv) C:\work\day16>python pickle_demo.py
<class ‘list‘>
[1, 2, 3]
# 多次写入到同一个文件中
with open(‘c.txt‘, mode=‘ab‘) as f:
pickle.dump([1, 2, 3], f)
pickle.dump([1, 2, 3], f)
pickle.dump([1, 2, 3], f)
# 从文件中反序列化pickle数据
# for x in f: 不能用 因为这是按行读取,而我看文件中其实只有一行
# 这个不常用, 因为多次写入,多次取出,必须知道写入的人写了几次,但是工作中说不定写的人已经不在或者忘记了
with open(‘c.txt‘, mode=‘rb‘) as f:
for x in range(4):
res = pickle.load(f)
print(res)
pickle最常用的场景: 和json一样 一次性写入 一次性读取
# json pickle 的比较:
"""
json:
1.不是所有的数据类型都可以序列化
2.不能多次对同一个文件进行序列化
例: json.dump([1, 2, 3], f)不行 但可以使用 f.write(json.dump([1, 2, 3]))
3. json数据可以跨语言
pickle:
1.所有python类型都能序列化, 结果是字节串
2.可以多次对同一个文件序列化
3.不能跨语言(除了c可能可以, 因为python是用c写的
"""
原文:https://www.cnblogs.com/sunnywillow/p/13251933.html