ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

序列化和反序列化

2021-04-07 20:02:26  阅读:198  来源: 互联网

标签:序列化 name age json x00 pickle


 

1.概念

 

将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML、JSON或特定格式的字节串)的过程称为序列化;反之,则称为反序列化。

 

2.json模块

 

大部分编程语言都会提供处理json数据的接口,Python 2.6开始加入了json模块,且把它作为一个内置模块提供,无需下载即可使用。
Python的JSON模块 序列化与反序列化的过程分别叫做:encoding 和 decoding。
encoding: 把Python对象转换成JSON字符串
decoding: 把JSON字符串转换成python对象

In [1]:
import json

d = {'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
j = json.dumps(d)
j
Out[1]:
'{"name": "tom", "age": 20, "interest": ["music", "movie"]}'
In [2]:
d1 = json.loads(j)
d1
Out[2]:
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
 

1)sort_keys参数: 表示序列化时是否对dict的key进行排序(dict默认是无序的)

In [3]:
j1 = json.dumps(d, sort_keys=True)
j1
Out[3]:
'{"age": 20, "interest": ["music", "movie"], "name": "tom"}'
 

2)indent参数: 表示缩进的意思,它可以使得数据存储的格式变得更加优雅、可读性更强;如果indent是一个非负整数或字符串,则JSON array元素和object成员将会被以相应的缩进级别进行打印输出;如果indent是0或负数或空字符串,则将只会插入换行,不会有缩进。

In [4]:
j2 = json.dumps(d, sort_keys=True, indent=4)
j2
Out[4]:
'{\n    "age": 20,\n    "interest": [\n        "music",\n        "movie"\n    ],\n    "name": "tom"\n}'
In [5]:
# 序列化到文件中
with open('test.json', 'w') as fp:
    json.dump(d, fp, indent=4)
In [6]:
# 反序列化文件中的内容
with open('test.json', 'r') as fp:
    d3 = json.load(fp)
d3
Out[6]:
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
 

3.pickle模块

 

pickle模块实现了用于对Python对象结构进行 序列化 和 反序列化 的二进制协议,与json模块不同的是pickle模块序列化和反序列化的过程分别叫做 pickling 和 unpickling:
pickling: 是将Python对象转换为字节流的过程;
unpickling: 是将字节流二进制文件或字节对象转换回Python对象的过程;

pickle模块与json模块对比:
1.JSON是一种文本序列化格式(它输出的是unicode文件,大多数时候会被编码为utf-8),而pickle是一个二进制序列化格式;
2.JOSN是我们可以读懂的数据格式,而pickle是二进制格式,我们无法读懂;
3.JSON是与特定的编程语言或系统无关的,且它在Python生态系统之外被广泛使用,而pickle使用的数据格式是特定于Python的;
4.默认情况下,JSON只能表示Python内建数据类型,对于自定义数据类型需要一些额外的工作来完成;pickle可以直接表示大量的Python数据类型,包括自定数据类型(其中,许多是通过巧妙地使用Python内省功能自动实现的;复杂的情况可以通过实现specific object API来解决)

In [9]:
import pickle

# pickle序列化
d = {'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
p = pickle.dumps(d)
p
Out[9]:
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00tomq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x08\x00\x00\x00interestq\x04]q\x05(X\x05\x00\x00\x00musicq\x06X\x05\x00\x00\x00movieq\x07eu.'
In [12]:
# pickle反序列化
d4 = pickle.loads(p)
d4
Out[12]:
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
In [13]:
# 持久化到文件
with open('pickle.txt', 'wb') as f:
    pickle.dump(d, f)
In [14]:
# 从文件中读取数据
with open('pickle.txt', 'rb') as f:
    d5 = pickle.load(f)
d5
Out[14]:
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
 

4.实例:自定义数据类型的序列化/反序列化

 

首先来自定义一个数据类型:

In [15]:
class Student(object):
    def __init__(self, name, age, sno):
        self.name = name
        self.age = age
        self.sno = sno

    def __repr__(self):
        return 'Student [name: %s, age: %d, sno: %d]' % (self.name, self.age, self.sno)
 

pickle模块可以直接对自定数据类型进行序列化/反序列化操作,无需编写额外的处理函数或类。

In [17]:
stu = Student('Tom', 19, 1)
stu
Out[17]:
Student [name: Tom, age: 19, sno: 1]
In [18]:
# 持久化到文件
with open('stu_pickle.txt', 'wb') as f:
    pickle.dump(stu, f)
In [19]:
# 从文件中读取数据
with open('stu_pickle.txt', 'rb') as f:
    stu_pickle = pickle.load(f)
stu_pickle
Out[19]:
Student [name: Tom, age: 19, sno: 1]
In [ ]:  

标签:序列化,name,age,json,x00,pickle
来源: https://www.cnblogs.com/xinmomoyan/p/14629299.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有