概述
数据格式
若要将一个系统内的数据通过网络传输给其他系统或客户端,常需将这些数据转化为字符串或字节串并需规定一种统一的数据格式才能让数据接收端正确解析并理解这些数据的含义
常用数据交换格式:XML(早期)、JSON
若要将数据持久化到本地磁盘(只供系统内使用),则数据格式不要求标准统一了,只要本系统内部可识别即可
NT:系统内的转换协议常随编程语言版本的升级而发生变化,故常涉及转换协议与编程语言版本的兼容问题(如:pickle)
序列化/反序列化
序列化与反序列化:
将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如XML、JSON或特定格式的字节串)的过程称为序列化,反之称为反序列化
python相关模块
- json:实现python数据类型与通用json字符串之间的转换
dumps()、dump()、loads()、load - pickle:实现python数据类型与python特定二进制格式之间的转换
dumps()、dump()、loads()、load()
- shelve:专门用于将python数据类型的数据持久化到磁盘(是一个类似于dict的对象,操作十分便捷)
open()
模块分析
json
序列化与反序列化
序列化:将python对象转换为json字符串
反序列化:json字符串转换为python对象
- 常用方法:
# 序列化:将Python对象转换成json字符串
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
# 反序列化:将json字符串转换成Python对象
loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- 直接读取文件中的json的序列/反序列化操作
# 序列化:将Python对象转换成json字符串并存储到文件中
dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
# 反序列化:读取指定文件中的json字符串并转换成Python对象
load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- NT:关于数据类型
- py dict的非字符串key转换成JSON字符串时都会转换为小写
- py的tuple在序列化时会被转为array,但反序列化时array会被转为list
函数应用
序列化
json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)})
# '{"a": "str", "c": true, "b": 11.1, "e": 10, "d": null, "g": [4, 5, 6], "f": [1, 2, 3]}'
参数:
sort_keys:表示序列化时是否对dict的key进行排序
indent:缩进几个字符(若为非负整数或字符串:相应缩进进行打印输出;若=0或空字符串,:插入换行,不缩进)
pickle
用途:实现了对python对象结构进行序列化和反序列化的二进制协议
- pickling:python对象转为字节流
- unpickling:字节流二进制文件或字节对象转换回python对象
与json区别:
- json是文本序列格式(输出unicode文件,大多数被编码为utf-8),pickle是二进制序列化格式
- json是可以读懂的数据,pickle无法读懂
- 默认情况,json表示python内置类型,pickle表示自定数据类型
相关函数
# 将指定的Python对象通过pickle序列化作为bytes对象返回,而不是将其写入文件
dumps(obj, protocol=None, *, fix_imports=True)
# 将通过pickle序列化后得到的字节对象进行反序列化,转换为Python对象并返回
loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict")
# 将指定的Python对象通过pickle序列化后写入打开的文件对象中,等价于`Pickler(file, protocol).dump(obj)`
dump(obj, file, protocol=None, *, fix_imports=True)
# 从打开的文件对象中读取pickled对象表现形式并返回通过pickle反序列化后得到的Python对象
load(file, *, fix_imports=True, encoding="ASCII", errors="strict")