python pickle

1. pickle

"""
pickle
将python中所有的数据类型(包含set)变成字节串: 序列化过程
将字节串转换成python中数据类型: 反序列化过程
"""


import pickle
bys = pickle.dumps([1, 2, 3])
print(type(bys))
print(bys)


1.1 序列化过程

1.1.1 列表

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.'




1.1.2 元组

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'>

1.1.3 集合

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'>

1.1.4 在文件中dump

# 从文件中把序列化内容写入
# 当初我们在json中 打开文件的方式是 at  append text模式
# 而我们现在是写入字节 理所当然 更改为 wb, 且二进制不需要encode
with open('c.txt', mode='wb') as f:
    pickle.dump([1, 2, 3], f)

image-20200610164101178

1.1.5 从文件中load 反序列化

# 从文件中反序列化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]

1.1.6 多次写入取出

# 多次写入到同一个文件中
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)

1.1.7总结

pickle最常用的场景: 和json一样 一次性写入 一次性读取

2. 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写的
"""

posted on 2020-07-05 21:28  sunnywillow  阅读(166)  评论(0编辑  收藏  举报