「@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}]
>>>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)。也就是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对象中读取序列化的信息,而非从文件中读取。
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 jsonmy_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,传送门~[1] ,里面更有大厂面试完整考点,欢迎 Star。
❞
Reference
[1]传送门~: https://github.com/MaoliRUNsen/runsenlearnpy100
更多的文章
点击下面小程序
- END -