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

@Author: Runsen

听过Python序列化pickle和Json标准库吗?

pickle

pickle模块是以二进制的形式序列化后保存到文件中(保存文件的后缀为”.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 = [{'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_string
b'\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_1
b']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__1
b'\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 pickle
with open('data.pkl', 'wb') as f:
    pickle.dump(data, f)

load和loads

现在给你这个data_string 你能知道这是啥吗?

虽然 pickle 编码的字符串并不一定可读,但是我们可以用 pickle.loads() 来从这个字符串中恢复原对象中的内容(load string)。也就是dumpsloads 有相反的作用。

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对象中读取序列化的信息,而非从文件中读取。

Json

JSON(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字典可以用单引号,也可以用双引号。

常用json就知道,json和pickle完全一样,json模块也提供了四个常用的方法:dumps、dump、loads、load,用于字符串 和 python数据类型间进行转换。

APi 描述
json.dumps(obj) 将python数据转化为json
json.loads(s) 将json数据转换为python的数据
json.dump(obj, fp) 转换为json并保存到文件中
json.load(fp) 从文件中读取json,并转化为python数据

API的使用

import json
my_dict = {'a':'1','b':'2','c':'3','d':'4'}
print(type(my_dict))
a = json.dumps(my_dict)
print(a)
print(type(a))
b=json.loads(a)
print(b)
print(type(b))

# 输出如下
<class 'dict'>
{"a": "1", "b": "2", "c": "3", "d": "4"}
<class 'str'> #json的字符串
{'a': '1', 'b': '2', 'c': '3', 'd': '4'}
<class 'dict'>

——————————
>>> import json
>>> print (json.dumps('中国'))
"\u4e2d\u56fd"
>>> # 这里有一个ensure_ascii参数,表示是否用ascii解析
>>> print(json.dumps('中国', ensure_ascii=False))
"中国"
——————————
#json.dump() 和 json.load() 来编码和解码JSON数据,用于处理文件。

import json
my_dict = {'a':'1','b':'2','c':'3','d':'4'}
json.dump(my_dict,open('a.txt','w'))
print(json.load(open('a.txt','r')))

# 输出如下
会生成一个“a.txt"文件
{'a': '1', 'b': '2', 'c': '3', 'd': '4'}

本文已收录 GitHub,传送门~ ,里面更有大厂面试完整考点,欢迎 Star。

Tags: