社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python开发 • 4 年前 • 264 次点击  
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇

作者丨小sen

来源丨Python之王


「@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)。也就是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'}

Reference

[1]

传送门~: https://github.com/MaoliRUNsen/runsenlearnpy100


-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

点击👆卡片,关注后回复【面试题】即可获取

在看点这里好文分享给更多人↓↓

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/114294
 
264 次点击