博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 学习笔记 - 序列化和反序列化
阅读量:6690 次
发布时间:2019-06-25

本文共 3021 字,大约阅读时间需要 10 分钟。

这一节看看在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,如需转载请自行联系原作者
你可能感兴趣的文章
初级网络运维工程师比赛题目
查看>>
跨交换机实现vlan实验报告
查看>>
jquery easyui滚动条部分设置介绍
查看>>
cannot find -lxxx问题
查看>>
预防云端开源项目打包 Redis Labs再更改模块
查看>>
超惊人!去年发生的身分外泄安全事件是2017的4倍
查看>>
oracle sqlplus免安装的配置instantclient-basiclite
查看>>
Java开发GUI之选择列表
查看>>
一、分布式商城架构逻辑图
查看>>
机器人是如何完成避障的?机器人避障解决方案解读
查看>>
通过错误堆栈信息和源码分析错误来源
查看>>
C和C++ 读写文件速度问题
查看>>
layer.mobile 弹出框插件(2.0版)
查看>>
IDC服务品质协议范本留存
查看>>
在 overlay 中运行容器 - 每天5分钟玩转 Docker 容器技术(51)
查看>>
前端MVC框架 EmberJS总结
查看>>
LVS
查看>>
搭建高可用mongodb集群(三)—— 深入副本集内部机制
查看>>
C#基础 条件语句、选择语句和循环语句
查看>>
15款经典图表软件推荐
查看>>