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,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
网络协议 Java Linux
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。
460 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
2月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
173 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
2月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
184 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
2月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
73 1
|
2月前
|
Ubuntu Linux Python
Ubuntu学习笔记(六):ubuntu切换Anaconda和系统自带Python
本文介绍了在Ubuntu系统中切换Anaconda和系统自带Python的方法。方法1涉及编辑~/.bashrc和/etc/profile文件,更新Anaconda的路径。方法2提供了详细的步骤指导,帮助用户在Anaconda和系统自带Python之间进行切换。
124 1
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
2月前
|
存储 Python
【免费分享编程笔记】Python学习笔记(二)
【免费分享编程笔记】Python学习笔记(二)
48 0
【免费分享编程笔记】Python学习笔记(二)