Python 学习笔记 - 序列化和反序列化

简介:

这一节看看在Python中如何序列化和反序列化。简单的说,序列化就是把内存中保存的数据类型转换为可以存储或者传输的过程,比如说我把一个字典转换为一个字符串这样就可以方便传递或者保存了;反序列化则是倒过来,把字符串转换为对应的数据类型。


Python里面常用的有两种方式。


  1. JSON

  2. Pickle



首先来看看JSON,


例1 比如说我有一个字典如下所示:


1
2
3
4
5
>>>  import  json
dic = { "k1" : "v1" }
print (dic, type (dic))
- - - - - - - - - - - - - - - - - - - - - - - - -
{ 'k1' 'v1' } < class  'dict' >

通过 json.dumps就能转换为字符串了

1
2
3
4
>>> result = json.dumps(dic)
print (result, type (result))
- - - - - - - - - - - - - - - - - - - - - - - - - -
{ "k1" "v1" } < class  'str' >


倒过来,如何把字符串转换成对应的结构呢?

可以用json.loads ; 前面学函数的时候学了eval,他也可以的

1
2
3
4
5
6
7
8
9
>>> s = '{"k1":"v1"}'
dic = json.loads(s)
dic2 = eval (s)
# dic3=pickle.loads(s)
print (dic, type (dic))
print (dic2, type (dic2))
- - - - - - - - - - - - - - - - - - - - -
{ 'k1' 'v1' } < class  'dict' >
{ 'k1' 'v1' } < class  'dict' >


例2: 调用http request获取一个天气的json格式的字符串,然后把他转换成字典输出

1
2
3
4
5
6
7
8
9
10
>>>  import  requests
import  json
response  =  requests.get( 'http://wthrcdn.etouch.cn/weather_mini?city=北京' )
response.encoding  =  'utf-8'
dic  =  json.loads(response.text)
print (dic)
print ( type (dic))
- - - - - - - - - - - - - - -
{ 'desc' 'OK' 'status' 1000 'data' : { 'forecast' : [{ 'fengxiang' '无持续风向' 'fengli' '微风级' 'type' '晴' 'high' '高温 31℃' 'date' '7日星期三' 'low' '低温 19℃' }, { 'fengxiang' '北风' 'fengli' '3-4级' 'type' '晴' 'high' '高温 31℃' 'date' '8日星期四' 'low' '低温 19℃' }, { 'fengxiang' '无持续风向' 'fengli' '微风级' 'type' '晴' 'high' '高温 31℃' 'date' '9日星期五' 'low' '低温 18℃' }, { 'fengxiang' '无持续风向' 'fengli' '微风级' 'type' '多云' 'high' '高温 30℃' 'date' '10日星期六' 'low' '低温 18℃' }, { 'fengxiang' '无持续风向' 'fengli' '微风级' 'type' '阵雨' 'high' '高温 25℃' 'date' '11日星期天' 'low' '低温 17℃' }],  'wendu' '27' 'yesterday' : { 'low' '低温 21℃' 'type' '多云' 'high' '高温 30℃' 'fx' '无持续风向' 'date' '6日星期二' 'fl' '微风' },  'city' '北京' 'aqi' '82' 'ganmao' '各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。' }}
< class  'dict' >


例3.  序列化,反序列化列表也是可以。反序列化的时候,需要外面用单引号,里面用双引号

1
2
3
4
5
6
7
8
>>> r  =  json.dumps([ 11 , 22 , 33 ])
print (r, type (r)
li  =  '["alex", "eric"]'
ret  =  json.loads(li)   # 反序列化时,一定要使用   "
print (ret, type (ret))
- - - - - - - - - - - - - - - - - - - - - - -
[ 11 22 33 ] < class  'str' >
[ 'alex' 'eric' ] < class  'list' >


JSON不仅可以在字符串和数据类型之间转换,还可以进一步把字符串写入文件,或者倒过来。

例如 json.load和json.dump多做了一步文件的操作


1
2
3
4
li  =  [ 11 , 22 , 33 ]
json.dump(li, open ( 'db' , 'w' ))
li  =  json.load( open ( 'db' , 'r' ))
print ( type (li),li)



第二个常见的方法是通过pickle


pickle是python自己特有的方法,他会把数据结构转换为特殊的字符串格式,他的优点是可以支持各种复杂类的操作;而json转换的字符串所以的编程语言都能识别,不过只能支持基本的数据类型,比如列表,字典等等。


例 可以看见他的字符串是2进制的

1
2
3
4
5
6
7
8
li  =  [ 11 , 22 , 33 ]
=  pickle.dumps(li)
print (r)
result  =  pickle.loads(r)
print (result)
- - - - - - - - - - -
b '\x80\x03]q\x00(K\x0bK\x16K!e.'
[ 11 22 33 ]

因此,当写入文件的时候,也需要用2进制格式

1
2
li  =  [ 11 , 22 , 33 ]
pickle.dump(li,  open ( 'db' 'wb' ))






本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1847223,如需转载请自行联系原作者

目录
相关文章
|
20天前
|
存储 C语言 Python
【Python】学习笔记day3
【Python】学习笔记day3
26 1
|
29天前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
12 0
|
1月前
|
存储 Java 数据库
|
3月前
|
Go
golang力扣leetcode 297.二叉树的序列化与反序列化
golang力扣leetcode 297.二叉树的序列化与反序列化
24 0
|
3月前
|
分布式计算 Java 大数据
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
53 0
|
6天前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
15 5
|
27天前
|
算法 搜索推荐 测试技术
python排序算法及优化学习笔记1
python实现的简单的排序算法,以及算法优化,学习笔记1
33 1
|
29天前
|
存储 C#
C#中的序列化和反序列化案例
C#中的序列化和反序列化案例
11 0
|
1月前
|
JSON Java Maven
使用Jackson进行 JSON 序列化和反序列化
使用Jackson进行 JSON 序列化和反序列化
23 0
|
1月前
|
存储 JSON 网络协议
【计算机网络】序列化,反序列化和初识协议
【计算机网络】序列化,反序列化和初识协议

热门文章

最新文章