序列化
,在Python中叫pickling
,在其他语言中也被称之为serialization
,marshalling
,flattening
等等,都是一个意思。序列化
之后,就可以把序列化
后的内容写入磁盘,或者通过网络传输到别的机器上。序列化
的对象重新读到内存里称之为反序列化
,即unpickling
。Python提供了pickle模块
来实现序列化。注意,pickle模块
下有两个非常相似的序列化
方法,dumps
和dump
dumps
仅仅是把内存中的Python对象进行序列化,并返回一个序列化的结果;dump
不仅要序列化,还要把序列化后的内容写入到指定的已经打开的文件中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.'
with open('dump.txt','wb') as f: # 即便没有dump.txt这个文件,内置的open函数也会自动在工作目录进行创建
pickle.dump(d,f) #dump序列化并写入文件一步到位
反序列化也有两个相似的方法,分别是pickle.loads
和pickle.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
用时候再总结
参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017624706151424#0
json.dumps参数之解:https://www.jianshu.com/p/cfbcd9f8691c