Python对象序列化与反序列化(pickle模块和json模块)

一. pickle序列化

 为何序列化

  • 序列化
    我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serializationmarshallingflattening等等,都是一个意思。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
  • 反序列化
    反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。Python提供了pickle模块来实现序列化。

示例

 1.序列化

注意,pickle模块下有两个非常相似的序列化方法,dumpsdump

  • dumps仅仅是把内存中的Python对象进行序列化,并返回一个序列化的结果;
  • dump不仅要序列化,还要把序列化后的内容写入到指定的已经打开的文件中
dumps序列化
import pickle
d = dict(name='Bob', age=20, score=88)
# 
# 
# 
pickle.dumps(d)

输出如下

b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00Bobq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x05\x00\x00\x00scoreq\x04KXu.'
dumps序列化并写入文件二合一
with open('dump.txt','wb') as f:  # 即便没有dump.txt这个文件,内置的open函数也会自动在工作目录进行创建
    pickle.dump(d,f) #dump序列化并写入文件一步到位

 2.反序列化

反序列化也有两个相似的方法,分别是pickle.loadspickle.load

  • pickle.loads仅仅是把在内存中可获得的序列化后的对象做反序列化,不能直接从文件中读取序列化对象并做反序列化操作;
  • pickle.load则会直接从已经打开的文件中读取序列化对象,并进行反序列化操作。

下面进行举例:

with open('dump.txt','rb') as f:
    d = pickle.load(f) # load函数会自动从已经打开的文件f中读取内容,读取方法其实是调用了f.read()
    print(f.tell()) # 当上一步通过f.read()读取了n字节的内容后,f.read()的指针对象会向后移动n位。通过f.tell()可以获悉当前的指针位置
    f.seek(0,0)  # 如果想重新读一遍内容,可以通过f.seek()将指针移动到文件的开头处,然后调用f.read()方法
    content = f.read() # 读取了序列化内容到内存中
    d_another = pickle.loads(content) # 把内存中的序列化内容进行反序列化操作
print(d,'\n',d_another)

结果显示如下:

55
{'name': 'Bob', 'age': 20, 'score': 88} 
 {'name': 'Bob', 'age': 20, 'score': 88}

上面我们进行两次的反序列化操作仅仅是为了举例,实际中当然不会这么做。
关于上面的f.tell()和f.seek()方法,详情可以参考:http://c.biancheng.net/view/4780.html

二. json序列化模块

用时候再总结
参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017624706151424#0

json.dumps参数之解:https://www.jianshu.com/p/cfbcd9f8691c

你可能感兴趣的:(Pyhton,python)