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

目录
相关文章
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
279 2
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
300 2
|
9月前
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
174 1
|
9月前
|
JSON Java 数据库连接
|
10月前
|
存储 安全 IDE
说一说序列化与反序列化中存在的问题
本文详细解析了Java中的序列化机制,包括序列化的概念、实现方式及应用场景。通过Student类的实例演示了对象的序列化与反序列化过程,并分析了`Serializable`接口的作用以及`serialVersionUID`的重要意义。此外,文章还探讨了如何通过自定义`readObject()`方法增强序列化的安全性,以及解决可序列化单例模式中可能产生的多实例问题。最后提供了代码示例和运行结果,帮助读者深入理解序列化的原理与实践技巧。
256 2
|
10月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
697 1
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
806 0

热门文章

最新文章

推荐镜像

更多