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 模块的更多相关文章

  1. python之os与json&pickle模块

     一.os模块 简单概述一下os模块就是与操作系统交互的一个接口 import os #os.getcwd() print(os.getcwd()) # 获取到当前工作目录 # 运行结果:E:\pyt ...

  2. [re模块、json&pickle模块]

    [re模块.json&pickle模块] re模块 什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则 ...

  3. 20181205(模块循环导入解决方案,json&pickle模块,time,date,random介绍)

    一.补充内容 循环导入 解决方案: 1.将导入的语句挪到后面. ​ 2.将导入语句放入函数,函数在定义阶段不运行 #m1.pyprint('正在导入m1')   #②能够正常打印from m2 imp ...

  4. json/pickle模块(序列化)

    什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes 为什么要序列化? 你打游戏过程中,打累了,停下来,关掉游戏.想 ...

  5. day 19 os模块的补充 序列化 json pickle

    os   模块 os.path.abspath  规范绝对路径 os.path.split() 把路径分成两段,第二段是一个文件或者是文件夹 os.path.dirname    取第一部分 os.p ...

  6. 模块 序列化 json pickle shelv xml

    序列化 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. json 模块 json.dump(d,f) json.load(f ...

  7. Python(正则 Time datatime os sys random json pickle模块)

    正则表达式: import re #导入模块名 p = re.compile(-]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表 ...

  8. json&pickle模块

    序列化:我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化 反序列化:把变量内容从序列化的对象重新读到内存中,这一过程称为反序列化 为什么要序列化? 1.持久保存状态 一个软件的执行就是在处 ...

  9. Day 4-5 序列化 json & pickle &shelve

    序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 反序列化: 把字符转成内存里的数据类型. 用于序列化的两个模块.他 ...

随机推荐

  1. Android图标

    在线生成安卓App图标.IOS App图标 https://icon.wuruihong.com

  2. mybatis的配置和使用

    mybatis的配置和使用 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  3. Spring源码工程导入Eclsipse缺少两个jar文件

    按照<Spring源码深度解析>所述,使用gradle cleanidea eclipse将Spring源码转为eclipse工程后,导入eclipse,最后发现还是缺少spring-cg ...

  4. gradle环境变量设置_配置注意事项

    看<Spring源码深度解析>的时候,在windows7系统中按照书里配置gradle环境变量,配置完后输入gradle -v,一直显示:'gradle'不是内部或外部命令,也不是可执行的 ...

  5. Trie树(字典树)的介绍及Java实现

    简介 Trie树,又称为前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前缀,也 ...

  6. 1 小时 SQL 极速入门(二)

    上篇我们说了 SQL 的基本语法,掌握了这些基本语法后,我们可以对单表进行查询及计算分析.但是一个大的系统,往往会有数十上百张表,而业务关系又错综复杂.我们要查的数据往往在好几张表中,而要从多张表中来 ...

  7. Select下拉框使用ajax异步绑定数据

    <!--前端样式--> <style> #searchs { width: 200px; position: absolute; border-top: none; margi ...

  8. 非对称加密技术中,iFace [ 爱妃链 ]人脸密钥技术排名第三,将弥补区块链现有不足

    最近,区块链领域,出现了一个比较热门技术的讨论,人脸密钥技术,可能大家还对这个名词感到很陌生,但是熟悉加密技术的技术大牛可能一听就能够明白大体的意思了,但是也正是这一熟悉而陌生的技术名词,掀起了区块链 ...

  9. 1. VIM 系列 - 简单入门,拾起兴趣

    目录 1. 认识模式 1.1 正常模式 1.2 插入模式 1.3 命令模式 1.4 可视模式 2. 常用快捷键 1. 认识模式 vim 一共有四种模: 1. 正常模式 2. 插入模式 3. 命令模式 ...

  10. JVM内存知识备忘

    又是一篇备忘... 主要记录一些知识,进行一些资源的汇总. 先来群里liufor大大提供的两张图,清晰易懂: Dockerized Java https://www.youtube.com/watch ...