pickle模块,json模块

(1)把变量从内存中变成可存储或传输的过程,称之为序列化。Python中叫pickling,其他语言中也被称为serialization,marshalling,flattening等,都是相同的意思。

(2)序列化之后,就可以把序列化后的内容(序列化后的内容是一个Bytes)写入磁盘,或者通过网络传输到别的机器上。

(3)把变量内容从序列化的对象重新读到内存里,称之为反序列化,即unpickling。

(4)Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用pickle保存那些不重要的数据,不能成功地反序列化也没关系。

把一个对象序列化并写入文件,有两种方法:

(1)pickle.dumps( )方法: 把任意对象序列化成一个bytes,然后,通过一定方式把这个bytes写入文件。import pickle

d=dict(name='bob',age=23,score=98)

print(pickle.dumps(d))

(2)pickle.dump( )方法: 直接把对象序列化后写入一个file-like Objectimport pickle

d=dict(name='shirley',age=23,score=98)

f=open('dump.txt','wb')  #因为序列化之后是bytes,所以是wb

pickle.dump(d,f)

f.close()

#通过pickle.dump()将对象保存到文件中,通过下面语句可以查看写入的序列化内容

f=open("dump.txt",'rb')#rb

print(f.read())

pickle.dumps( )和pickle.dump( )的区别:就在于中间过程我们是否还需要再做一些操作。

前者我们还要再做一些操作;后者不需要我们再进行任何操作。

同序列化一样,当要把对象从磁盘读到内存时,有两种方法:

(1)pickle.loads( ):可以先把内容读到一个bytes,然后用pickle.loads( )方法反序列化出对象

(2)pickle.load( ):直接用pickle.load( )方法从一个file-like Object中直接反序列化出对象import pickle

f=open('dump.txt','rb')

s=pickle.load(f)

f.close()

print("反序列化后的对象s:",s)

运行结果: 反序列化后的对象s: {'score': 98, 'age': 23, 'name': 'shirley'}

注意:这个反序列化后的对象和原来的变量d是完全不相干的,它们只是内容相同而已。

JSON

Python内置的json模块可以实现从Python对象到JSON格式的转换

(1)JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。

(2)JSON是标准格式,比XML更快,而且可以直接在Web页面中读取。

(3)JSON表示的对象就是标准的JavaScript语言的对象

JSON和Python内置的数据类型对应如下:

JSON类型------Python类型

{ }----------------dict

[ ]----------------list

"string"---------str

1234.56--------int或float

true/false-------True/False

null---------------None

注: 把Python对象转换成JSON格式时,只要是上面表格中列举的Python类型即可,其他类型,例如变量,就会报错。

把Python对象转换成JSON格式:json.dumps( )方法,json.dump( )方法(可以直接把JSON写入一个file-like Object)

要把JSON反序列化为Python对象:json.loads( )方法,json.load( )方法 (前者把JSON的字符串反序列化,后者从file-like Object 中读取字符串并反序列化)

实例:把Python对象变成一个JSONimport json

d=dict(name='shirley',age=23,score=98)

print(json.dumps(d))

print(isinstance(json.dumps(d),str)) #判断序列化后的内容类型

print(type(json.dumps(d)))#判断序列化后的内容类型

运行结果:json.dumps(d): {"name": "shirley", "age": 23, "score": 98}

True

JSON字符串反序列化:import json

json_str = '{"age": 20, "score": 88, "name": "Bob"}'

print(json.loads(json_str))

print(type(json.loads(json_str)))

注:由于JSON标准规定JSON编码是UTF-8,所以我们总是能正确地在Python的字符串str与JSON的字符串之间转换。

JSON进阶

由于Python的字典dict对象在上面表格列举的Python类型中,所以字典dict可以直接序列化为JSON的{ },不过,很多时候,更喜欢用class表示对象,比如定义Student类,然后序列化:import json

class Student(object):

def __init__(self,name,age,score):

self.name=name

self.age=age

self.score=score

s=Student('Nancy',24,89)

print(json.dumps(s))

运行结果:Traceback (most recent call last):

……………………………………

TypeError:  is not JSON serializable

错误的原因是:

Student对象不是一个可序列化为JSON的对象。 如果class的实例对象都无法序列化为JSON,这肯定不合理。(我的理解是class的实例对象s是一个变量,不在上面列举的Python类型中,所以报错)

前面的代码之所以无法把Student类实例序列化为JSON,是因为默认情况下,dumps( )方法不知道如何将Student实例变为一个JSON的{ }对象。

解决办法是:定制JSON序列化####对可选参数default进行设置,把任意class的实例变为dictprint(json.dumps(s, default=lambda obj: obj.__dict__))

通常类class的实例都有一个dict属性,它就是一个dict,用来存储实例变量(注意:是实例变量,即不同实例,该属性存储的变量不同,互不影响)。也有少数例外,比如定义了slots

同理,把JSON反序列化为一个Student对象实例,loads( )方法首先转换出一个dict对象,然后,我们传入的object_hook函数负责把dict转换为Student实例class Student(object):

def __init__(self,name,age,score):

self.name=name

self.age=age

self.score=score

import json

def dict2student(d):

return Student(d['name'], d['age'], d['score'])

json_str = '{"age": 20, "score": 88, "name": "Bob"}'

print(json.loads(json_str))

print(json.loads(json_str, object_hook=dict2student))

运行结果:{'age': 20, 'score': 88, 'name': 'Bob'}

打印出的是反序列化的实例对象。

小结

Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。

json模块的dumps( )和loads( )函数是定义得非常好的接口的典范。使用时只需要传入一个必须的参数。但是,当默认的序列化或反序列机制不满足我们的要求时,又可以传入更多的参数来定制序列化或反序列化的规则,既做到了接口简单易用,又做到了充分的扩展性和灵活性。

python学习网,免费的在线学习python平台,欢迎关注!

python 序列化_python怎么序列化相关推荐

  1. pythonjson序列化_Python Json序列化与反序列化的示例

    不同的编程语言有不同的数据类型; 比如说: Python的数据类型有(dict.list.string.int.float.long.bool.None) Java的数据类型有(bool.char.b ...

  2. python 序列化_python之序列化

    什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 把字符转换成内存数据类型,叫反序列化. 为什么要序列化? 你 ...

  3. python建立数据库并序列化_python之数据的序列化

    参考博客:http://www.cnblogs.com/yyds/p/6563608.html 数据的序列化功能表 json.dumps() 将python数据类型转换为(json)字符串 json. ...

  4. python建立数据库并序列化_Python之数据序列化(json、pickle、shelve)

    一.python类型数据和JSON数据格式互相转换 pthon 中str类型到JSON中转为unicode类型,None转为null,dict对应object 二. 序列化/反序列化 将对象转换为可通 ...

  5. 解决Python自带的json序列化工具不能序列化datetime类型数据问题

    解决Python自带的json序列化工具不能序列化datetime类型数据问题 参考文章: (1)解决Python自带的json序列化工具不能序列化datetime类型数据问题 (2)https:// ...

  6. python中常用的序列化模块_使用pickle模块对python对象进行序列化

    pickle模块是Python自带的一个标准模块,专用于Python各种对象的序列化和反序列化,可用于Python内置的各种数据对象(Python中一切都是对象),也可用于程序员自定义的类和对象. p ...

  7. python学习笔记 day20 序列化模块(二)

    pickle 可以将任何数据类型转为字符串:但是pickle之后的结果也只有python可以看懂,而且反序列化依靠python代码: pickle 和 json 很像 都是有dumps loads d ...

  8. 一文学会Python标准库struct序列化与反序列化

    使用Python标准库struct序列化Python整数.实数.字节串时,需要使用struct模块的pack()函数把对象按指定的格式进行序列化,然后使用文件对象的write()方法将序列化的结果字节 ...

  9. cpickle支持的python版本_Python cPickle模块(转)

    持久性就是指保持对象,甚至在多次执行同一程序之间也保持对象.通过本文,您会对 Python对象的各种持久性机制(从关系数据库到 Python 的 pickle以及其它机制)有一个总体认识.另外,还会让 ...

最新文章

  1. 武器化道路越走越远的无人机
  2. golang sync.Mutex 互斥锁 使用实例
  3. 炎炎夏日需要一个清凉的地 - 自制水冷系统
  4. Linux 下修改(NTFS或fuseblk)磁盘(卷标)显示名称
  5. OS X下使用OpenGL做离屏渲染
  6. mysql中ak替换键_数据库:唯一性约束_alternate key(替换键) mySQL Oracle 数据库 ak 唯一性约束...
  7. mysql查看sql代价_mysql 代价
  8. 数据结构——平衡二叉树
  9. java编写设置按钮随机背景色_java – 如何设置自定义按钮状态背景颜色?
  10. 杨镭访谈:UCloud 的技术价值观
  11. 计算机应用基础南丁格尔,关于单元基础训练的习题
  12. Python: 第三方模块(modules)的安装位置 (2014-08-24 23:19:18)转载▼ 标签: site-packages dist-packages 默认安装目录 分类: Pyth
  13. 微信小程序页面跳转失效原因
  14. 右手螺旋判断磁感应强度方向_如何判断磁感应强度方向 方法是什么
  15. [MySQL 工具] pt-query-digest使用出错问题分析Can't locate Time/HiRes.pm in @INC
  16. 支付宝小程序支付(统一收单交易创建接口)
  17. win10分屏设置壁纸+获取win10锁屏壁纸
  18. VsCode配置快速注释
  19. linux vim命令pdf,Linux中vi、vim命令大全
  20. 线性递推数列_学习笔记

热门文章

  1. animate.css 使用记录
  2. js canvas 画图线程处理
  3. POI中设置(居中,字体,边框等)Excel单元格样式
  4. 【渝粤题库】广东开放大学 土木工程CAD 形成性考核
  5. 从51单片机白痴到51单片机高手的快速成长
  6. 重读《C primer plus》(四)
  7. IP机顶盒系列一,WIZNET解决方案
  8. 如何管理计算机的游戏,我的计算机上有一个Master Lu游戏库,无法在控制面板中找到,也找不到360软件管理. 如何卸载?...
  9. C语言:qsort()解析
  10. 如何在mac电脑终端中输入“python”来启动python