Python入门自学进阶——4--序列化和结构化数据

本文介绍了Python中常见的四种对象序列化方式:json、pickle、shelve和xml。json模块用于轻量级的数据交换,适用于简单的数据结构;pickle模块能序列化Python对象,包括函数,但安全性较低;shelve提供类似字典的持久化存储,简单易用;xml则是一种结构化的数据存储格式。理解这些模块有助于在不同场景下选择合适的序列化方法。
摘要由CSDN通过智能技术生成

对于一个对象,如一个变量,从内存中保存到磁盘中一个文件中,即进行序列化,可以如下:

 一、json

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。JSON是一个序列化的对象或数组。
1. 六个构造字符:
begin-array = ws %x5B ws ; [ 左方括号
begin-object = ws %x7B ws ; { 左大括号
end-array = ws %x5D ws ; ] 右方括号
end-object = ws %x7D ws ; } 右大括号
name-separator = ws %x3A ws ; : 冒号
value-separator = ws %x2C ws ; , 逗号
2. 在这六个构造字符的前或后允许存在无意义的空白符(ws):
ws = *(%x20 /; 空间
%x09 /; 水平标签
%x0A /; 换行或换行
%x0D); 回程

值可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个。值中的字面值中的英文必须使用小写。
对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成,如:
    {"name": "John Doe", "age": 18, "address": {"country" : "china", "zip-code": "10000"}}
数组是由方括号括起来的一组值构成,如:
[3, 1, 4, 1, 5, 9, 2, 6]
3.2.3 字符串与C或者Java的字符串非常相似。字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

python中有json模块。

 json.dumps()将一个对象转换为一个json格式字符串。便于序列化写入文件,json.loads()将json格式字符串转换为python对象,这里是字典。

 对于像函数这样的对象,json无法序列化:

 二、pickle

pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议。 “Pickling”是将Python对象层次结构转换为字节流的过程, “unpickling”是反向操作,从而将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。pickle模块对于错误或恶意构造的数据是不安全的。对于序列化一个函数,可以使用pickle。

 

需要以字节形式写入文件,将文件的写入方式改为wb,文件中的内容:

 反序列化

 修改一下:

要注意的是,在loads()的时候,要让python能够找到对应的定义,否则会报错。也就是序列化对象 时,本模块中要有相应的定义。对于函数来说,上面的写法很怪异,感觉没什么用处,并且重复,关于对象的序列化和反序列化,感觉主要应用于类对象,一个类的实例序列化后,保存了相关数据,在另一个程序中反序列化,直接回复这个对象的一个实例,而类定义是必须的。

同时,使用Pickler实例在序列化对象的时候,它会“记住”已经被序列化的对象引用,所以对同一对象多次调用dump(obj),pickler不会“傻傻”的去多次序列化。

对于json和pickle,有dumps()、loads()和dump()、load()不同的两对函数。

 三、shelve

一个更简洁的序列化模块,只有一个open()方法:

 open()返回的是<shelve.DbfilenameShelf object at 0x0000000002128390>,类似字典,可以使用get()获取对应键的值。

四、xml

 一个xml文件

遍历xml

 修改

删除

 创建

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值