文档章节

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

乐搏学院
 乐搏学院
发布于 2017/04/01 14:55
字数 895
阅读 4
收藏 0

这一节看看在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))

-----------------------

[112233] <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.'

[112233]

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

 

1

2

li = [11,22,33]

pickle.dump(li, open('db''wb'))

 

 

 

 

登录乐搏学院官网http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

© 著作权归作者所有

共有 人打赏支持
乐搏学院
粉丝 9
博文 526
码字总数 707467
作品 0
丰台
程序员
私信 提问
Python3基础之学习笔记(六)-json与pickle数据序列化-项目目录结构-模块详解

文章目录 1. json与pickle数据序列化 2. 项目目录结构 3. 模块详解 1. json与pickle数据序列化 1.1 json序列化与反序列化 1.1.1 json序列化 1.1.2 json反序列化 1.1.3 json小结 Json只能进行...

GoldenKitten
01/15
0
0
Python模块学习 ---- pickle, cPickle 对象序列化/反序列化

上次学习过marshal模块用于序列化和反序列化,但marshal的功能比较薄弱,只支持部分内置数据类型的序列化/反序列化,对于用户自定义的类型就无能为力,同时marshal不支持自引用(递归引用)的对...

索隆
2012/05/04
0
0
python序列化数据本地存放

深入# 序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重 用,或者发送给其他人。你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的...

临峰不畏
2015/01/18
0
0
PySpark 通过Arrow加速

前言 PySpark是Spark 实现 Unify BigData && Machine Learning目标的基石之一。通过PySpark,我们可以用Python在一个脚本里完成数据加载,处理,训练,预测等完整Pipeline,加上DB良好的noteb...

祝威廉
01/28
0
0
Python3中json的操纵

在python中提供了标准库json将基本类型的数据转化成json格式,但是在涉及到自定义类型时需要扩展或者复写Encoder(Decoder)来实现,默认情况下json会抛出"TypeErro: xxx is not json serial...

gangzz
2014/02/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
4
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
4
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部