欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Pythoy 数据类型序列化——json&pickle 模块

程序员文章站 2022-07-06 19:24:52
Pythoy 数据类型序列化——json&pickle 模块 TOC 什么是序列化/反序列化 pickle 模块 json 模块 对比json和pickle json.tool 命令行接口 什么是序列化/反序列化? 就是将内存中的数据类型变成可存储或传输的东西,这一过程叫做序列化,在python中叫 ......

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文件