三十、深入Python中的Pickle和Json模块

「@Author: Runsen」
听过Python序列化pickle和Json标准库吗?
picklepickle模块是以二进制的形式序列化后保存到文件中(保存文件的后缀为".pkl") , 不能直接打开进行预览 。 而python的另一个序列化标准模块 json , 可以直接打开查看(例如在notepad++中查看) 。
pickle模块实现了基本的数据序列化和反序列化 。
所谓的序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程 , 比如数据转成文本 。
就是将数据结构转化成你看不懂的东西 。 相反的 , 从序列化的格式中解析对象状态的过程被称为“反序列化” 。
pickle提供四个功能:dumps,dump,loads,load ,和json差不多 。
dump和dumps序列化的方法为 pickle.dump()和pickle.dumps() 。
dump该方法的相关参数如下:
pickle.dump(obj, file, protocol=None,*,fix_imports=True)
该方法实现的是将序列化后的对象obj以二进制形式写入文件file中 , 进行保存 。
pickle.dumps()方法的参数如下:
pickle.dumps(obj, protocol=None,*,fix_imports=True)
pickle.dumps()方法跟 pickle.dump()方法的区别在于 , pickle.dumps()方法不需要写入文件中 , 它是直接返回一个序列化的bytes对象 。
下面具体一个具体示例 。
>>> import pickle>>> data = http://kandian.youth.cn/index/[{'a': 'A', 'b': 2, 'c': 2.22}]>>> # 使用 pickle.dumps() 可以将一个对象转换为二进制字符串(dump string):>>> data_string = pickle.dumps(data)>>> data[{'a': 'A', 'b': 2, 'c': 2.22}]>>>< data_stringb'\x80\x03]q\x00}q\x01(X\x01\x00\x00\x00aq\x02X\x01\x00\x00\x00Aq\x03X\x01\x00\x00\x00bq\x04K\x02X\x01\x00\x00\x00cq\x05G@\x01\xc2\x8f\\(\xf5\xc3ua.'dumps 可以接受一个可省略的 protocol 参数(默认为 0) , protocol参数不同 , 表示进行的编码协议不同 , 得到的data_string也不同 。
如果 protocol 参数指定为负数 , 那么将调用当前的最高级的编码协议进行编码
>>> data_string_1 = pickle.dumps(data, 1)>>> data_string_1b']q\x00}q\x01(X\x01\x00\x00\x00aq\x02X\x01\x00\x00\x00Aq\x03X\x01\x00\x00\x00bq\x04K\x02X\x01\x00\x00\x00cq\x05G@\x01\xc2\x8f\\(\xf5\xc3ua.'>>> data_string__1 = pickle.dumps(data, -1)>>> data_string__1b'\x80\x04\x95#\x00\x00\x00\x00\x00\x00\x00]\x94}\x94(\x8c\x01a\x94\x8c\x01A\x94\x8c\x01b\x94K\x02\x8c\x01c\x94G@\x01\xc2\x8f\\(\xf5\xc3ua.'如果需要保存为data.pkl , 可以使用dump方法 , 具体代码如下 。
import picklewith open('data.pkl', 'wb') as f:pickle.dump(data, f)load和loads现在给你这个data_string 你能知道这是啥吗?
【三十、深入Python中的Pickle和Json模块】虽然 pickle 编码的字符串并不一定可读 , 但是我们可以用 pickle.loads() 来从这个字符串中恢复原对象中的内容(load string) 。 也就是dumps 和loads 有相反的作用 。
pickle.loads()方法的参数如下:
pickle.loads(bytesobject, *,fiximports=True, encoding="ASCII". errors="strict")
>>> # pickle.loads() 来从这个字符串中恢复原对象中的内容(load string):>>> pickle.loads(data_string)[{'a': 'A', 'b': 2, 'c': 2.22}]如果指定了protocol参数 , 需要这些格式中恢复对象时 , 不需要指定所用的协议 , pickle.load() 会自动识别:
>>> pickle.loads(data_string_1)[{'a': 'A', 'b': 2, 'c': 2.22}]>>> pickle.loads(data_string__1)[{'a': 'A', 'b': 2, 'c': 2.22}]反序列化的方法还有 pickle.load() , 该方法的相关参数如下:
pickle.load(file, *,fix_imports=True, encoding="ASCII". errors="strict")
如果使用load , 需要读取data.pkl文件 。
pkl_file = open('data.pkl', 'rb')print(pickle.load(pkl_file))pickle.loads()方法跟 pickle.load()方法的区别在于 ,pickle.loads()方法是直接从bytes对象中读取序列化的信息 , 而非从文件中读取 。
JsonJSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式 。
它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集 , 采用完全独立于编程语言的文本格式来存储和表示数据 。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言 。 易于人阅读和编写 , 同时也易于机器解析和生成 , 并有效地提升网络传输效率 。
「JS对象」
var student = {name: ‘Runsen’,age: 18,feature : [‘高’, ‘富’,‘帅’]}「JSON字符串」
{“name”: “Runsen”,“age”: 18,“ feature “ : [‘高’, ‘富’,‘帅’]}「Python字典」
{‘name’: ‘Runsen’,‘age’: 18‘feature’ : [‘高’, ‘富’,‘帅’]}注意点:Json字符串必须用双引号(即:””)来包括, 值可以是字符串、数字、true、false、null、列表 , 或字典 。Python字典可以用单引号 , 也可以用双引号 。