Pythoy 数据类型序列化——json&pickle 模块
Pythoy 数据类型序列化——json&pickle 模块
TOC
- 什么是序列化/反序列化
- pickle 模块
- json 模块
- 对比json和pickle
- json.tool 命令行接口
什么是序列化/反序列化?
就是将内存中的数据类型变成可存储或传输的东西,这一过程叫做序列化,在python中叫pickling,在其它语言叫 serialization,marshalling,flattening等,其实base64转码也可叫做序列化,因为很多文本协议如http,smtp都是只支持ascii编码传输。
序列化之后可以将内容写入磁盘,或通过网络传输到其它机器。
反序列化就是序列化的逆过程,unpickling
__Python__提供了两个模块来进行序列化操作,分别是pickle和json
pickle模块
pickle是python语言专属的序列化方式。
pickle模块可以将python中的任何数据类型进行序列化,并序列化为bytes类型。
pickle模块提供的方法
- dump(obj, fp) 将obj序列化后直接写入fp对象中
- dumps(obj) 将obj序列化为bytes,方法return该bytes对象
- load(fp) 从fp中读取序列化bytes对象并反序列化
- loads(bytes) 将bytes反序列化
实践:
import pickle
with open('test.pkl', 'wb') as fp: # 注意因为pickle序列化后是bytes所以file-object 能够写入二进制,那么open的打开方式就必须是二进制方式'wb'。
pickle.dump({'a': 1, 'b': 2}, fp)
with open('test.txt', 'rb') as fp: # 同样读取也是要是一个binary file-object
print(pickle.load(fp))
- 助记:dumps带s就是序列化为string,dump不带s就是序列化为string后直接写入fp。load和loads也一样这样记。
- 如果pickle序列化写入文件,那么这个文件后缀最好用.pkl或.pk,辨识度高
json模块
json不多说,是数据交换的一种格式。叫 json document
json模块方法和pickle类似:
- dump(obj, fp) 将obj序列化后直接写入fp对象中,由于序列化后的json是字符串,所fp必须是text Stream类型
- dumps(obj) 将obj序列化为json字符串,方法return该json字符串
- load(fp) 从fp中读取json并反序列化 ,这个就不要求fp是text Stream类型,也就是从文件中既可以读取bytes,也可以string。
- loads(obj) 将json反序列化,可以是json的字符串或bytes 或bytearray
- 注意,tuple元组的序列化会会编程json的array数组,如果再进行deserialize就编程了列表而不是元组。
实验:
import json
i = 10
s = 'hello world!'
t = (1,)
l = [10, 'hello world!', ['a', 'b'], {'a': 1, 'b': 2}]
d = {'a': 1, 'b': 2, 'c': l}
print(json.dumps(i))
print(json.dumps(s))
print(json.dumps(t))
print(json.dumps(l))
print(json.dumps(d))
with open('test.json', 'w') as fp:
json.dump(l, fp)
with open('test.json', 'rb') as fp:
print(json.load(fp))
print(json.loads(b'[10, "hello world!", ["a", "b"], {"a": 1, "b": 2}]'))
结果:
10
"hello world!"
[1]
[10, "hello world!", ["a", "b"], {"a": 1, "b": 2}]
{"a": 1, "b": 2, "c": [10, "hello world!", ["a", "b"], {"a": 1, "b": 2}]}
[10, 'hello world!', ['a', 'b'], {'a': 1, 'b': 2}]
[10, 'hello world!', ['a', 'b'], {'a': 1, 'b': 2}]
对比json和pickle
json
- 在python中一般只能序列化int/str/list/dict
- 跨语言
pickle
- 能序列化python任何对象
- 只能在python中使用
json.tool 命令行接口
json.tool提供在命令行对json字符串进行json格式校验和漂亮打印pretty-print
用法:
:> echo '{"josn": "obj"}' | python -m json.tool
{
"json":"obj"
}
:> python -m json.tool mp_films.json # 后面跟json文件
Pythoy 数据类型序列化——json&pickle 模块的更多相关文章
- python之os与json&pickle模块
一.os模块 简单概述一下os模块就是与操作系统交互的一个接口 import os #os.getcwd() print(os.getcwd()) # 获取到当前工作目录 # 运行结果:E:\pyt ...
- [re模块、json&pickle模块]
[re模块.json&pickle模块] re模块 什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则 ...
- 20181205(模块循环导入解决方案,json&pickle模块,time,date,random介绍)
一.补充内容 循环导入 解决方案: 1.将导入的语句挪到后面. 2.将导入语句放入函数,函数在定义阶段不运行 #m1.pyprint('正在导入m1') #②能够正常打印from m2 imp ...
- json/pickle模块(序列化)
什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes 为什么要序列化? 你打游戏过程中,打累了,停下来,关掉游戏.想 ...
- day 19 os模块的补充 序列化 json pickle
os 模块 os.path.abspath 规范绝对路径 os.path.split() 把路径分成两段,第二段是一个文件或者是文件夹 os.path.dirname 取第一部分 os.p ...
- 模块 序列化 json pickle shelv xml
序列化 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. json 模块 json.dump(d,f) json.load(f ...
- Python(正则 Time datatime os sys random json pickle模块)
正则表达式: import re #导入模块名 p = re.compile(-]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表 ...
- json&pickle模块
序列化:我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化 反序列化:把变量内容从序列化的对象重新读到内存中,这一过程称为反序列化 为什么要序列化? 1.持久保存状态 一个软件的执行就是在处 ...
- Day 4-5 序列化 json & pickle &shelve
序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 反序列化: 把字符转成内存里的数据类型. 用于序列化的两个模块.他 ...
随机推荐
- 错误:Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file
Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file: /tmp/hsperfdat ...
- Web发展史
Web 万维网常称为WWW(World Wide Web)发展至今仅30年,英国计算机科学家,蒂姆 伯纳斯 李爵士 提出了 World Wide Web的设计方案,1990年李爵士完成了Web 所有的 ...
- JS加密对应的c#解码
escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,? ...
- Golang Go Go Go part2:变量及常量声明
三.关键字及内置预声明常量.类型.函数 1.关键字 Go有25个关键字,只能用在语法允许的地方,不能作为名称使用,它们是: break default func ...
- TCP/IP 详解常用术语
业务需要,最近看TCP/IP 这本书,专业名词太多了,总结一下,给后来着参考,直接使用. 后续会在读书时慢慢添加. ACK:(ACKnowledgment)TCP首部中的确认标志. ARP:地址解析协 ...
- HTTP/3 简介
前言 HTTP 2.0是由谷歌SPDY进化而来,现有的实现基本都是走SSL(说是可以不用SSL,但基本没这么干的),传输层使用TCP.HTTP 3.0是由谷歌QUIC进化出来的,QUIC没有大动HTT ...
- 插入与归并(python)(原创)
根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭 ...
- python安装whl文件
在命令指示符下(cmd)的Python3安装命令为: pip3 install 文件名.whl 安装出错: matplotlib-2.0.0-cp34-cp34m-win_amd64.whl is n ...
- .NET中如何深度判断2个对象相等
背景 最近在群里,有人问如何深度比较2个对象相等,感觉很有意思,就自己研究了一下,并写了一个开源的小类库,地址如下https://github.com/lamondlu/ObjectEquality. ...
- 漫画:htts是如何保证一台主机把数据安全发给另一台主机
通过漫画的形式由浅入深带你读懂htts是如何保证一台主机把数据安全发给另一台主机的 对称加密 一禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端.之后服务器给客户端发送真实数 ...