1. """ """
  2. __author__on__ = 'shaozhiqi 2019/9/24'
  3.  
  4. # !/usr/bin/env python3
  5. # -*- coding: utf-8 -*-
  6.  
  7. # 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:
  8. d = dict(name='Bob', age=20, score=88)
  9. # 我们把变量从内存中变成可存储或传输的过程称之为**序列化**,在Python中叫pickling
  10. # 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
  11. # 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
  12. # Python提供了pickle模块来实现序列化。
  13. import pickle
  14.  
  15. d = dict(name='Bob', age=20, score=88)
  16. pickle.dumps(d)
  17. # pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。
  18. # 或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:
  19. f = open('dump.txt', 'wb')
  20. pickle.dump(d, f)
  21. f.close()
  22. # 看看写入的dump.txt文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。如下:
  23. # �}q (X nameqX BobqX ageqKX scoreqKXu.
  24.  
  25. # -----------------------------------pickle反序列化------------------------------------
  26. # 当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,
  27. # 然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。
  28. # 我们打开另一个Python命令行来反序列化刚才保存的对象:
  29. f = open('dump.txt', 'rb')
  30. d = pickle.load(f)
  31. f.close()
  32. print(d) # {'name': 'Bob', 'age': 20, 'score': 88}
  33. # 当然,这个变量和原来的变量是完全不相干的对象,它们只是内容相同而已。
  34. #
  35. # Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,
  36. # 因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。
  37.  
  38. # ------------------------------------------json----------------------------------
  39. # 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,
  40. # 比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,
  41. # 可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。
  42. # JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
  43.  
  44. # JSON类型 Python类型
  45. # {} dict
  46. # [] list
  47. # "string" str
  48. # 1234.56 int或float
  49. # true/false True/False
  50. # null None
  51.  
  52. # -----------------Python对象->JSON--------------------------------------------
  53. import json
  54.  
  55. d = dict(name='Bob', age=20, score=88)
  56. json_d = json.dumps(d)
  57. print(json_d) # {"name": "Bob", "age": 20, "score": 88}
  58. # dumps()方法返回一个str,内容就是标准的JSON。类似的,dump()方法可以直接把JSON写入一个file-like Object。
  59.  
  60. # 要把JSON反序列化为Python对象,用loads()或者对应的load()方法,前者把JSON的字符串反序列化,
  61. # 后者从file-like Object中读取字符串并反序列化:
  62. json_str = '{"age": 20, "score": 88, "name": "Bob"}'
  63. dictvlaue = json.loads(json_str)
  64. print(dictvlaue)
  65. print(type(dictvlaue)) # <class 'dict'>
  66. # 可以看到转化为了dict类型
  67.  
  68. # ----------------------------------------------------------------------------------
  69. # Python的dict对象可以直接序列化为JSON的{},
  70. # 不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化:
  71.  
  72. import json
  73.  
  74. class Student(object):
  75. def __init__(self, name, age, score):
  76. self.name = name
  77. self.age = age
  78. self.score = score
  79.  
  80. s = Student('Bob', 20, 88)
  81.  
  82. # print(json.dumps(s))
  83. # TypeError: Object of type Student is not JSON serializable
  84.  
  85. # 错误的原因是Student对象不是一个可序列化为JSON的对象。
  86. # 可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可:
  87.  
  88. def student2dict(std):
  89. return {
  90. 'name': std.name,
  91. 'age': std.age,
  92. 'score': std.score
  93. }
  94.  
  95. # 这样,Student实例首先被student2dict()
  96. # 函数转换成dict,然后再被顺利序列化为JSON:
  97. print(json.dumps(s, default=student2dict)) # {"name": "Bob", "age": 20, "score": 88}
  98.  
  99. # 那么问题来了,难道我们每转化一个类为json都需要为其写一个转化函数吗?
  100. # 因为通常class的实例都有一个__dict__属性,它就是一个dict,用来存储实例变量。
  101. # 也有少数例外,比如定义了__slots__的class。
  102. print('student:', json.dumps(s, default=lambda obj: obj.__dict__))
  103.  
  104. # student: {"name": "Bob", "age": 20, "score": 88}
  105.  
  106. # 同样的道理,如果我们要把JSON反序列化为一个Student对象实例,
  107. # loads()方法首先转换出一个dict对象,然后,我们传入的object_hook函数负责把dict转换为Student实例:
  108. def dict2student(d):
  109. return Student(d['name'], d['age'], d['score'])
  110.  
  111. json_str = '{"age": 20, "score": 88, "name": "Bob"}'
  112. student2 = json.loads(json_str, object_hook=dict2student)
  113. print('json-student:', student2.name) # json-student: Bob

python3(三十八) serialize的更多相关文章

  1. NeHe OpenGL教程 第三十八课:资源文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. Java进阶(三十八)快速排序

    Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...

  3. SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)

    0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...

  4. 微信小程序把玩(三十八)获取设备信息 API

    原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...

  5. 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)

    1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...

  6. bp(net core)+easyui+efcore实现仓储管理系统——入库管理之二(三十八)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  7. Deep learning:三十八(Stacked CNN简单介绍)

    http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...

  8. 【FastDev4Android框架开发】打造QQ6.X最新版本号側滑界面效果(三十八)

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50253925 本文出自:[江清清的博客] (一).前言: [好消息] ...

  9. Python学习(三十八)—— Djago之Ajax

    转载自:http://www.cnblogs.com/yuanchenqi/articles/7638956.html 一.Ajax准备知识:json 什么是json? 定义: JSON(JavaSc ...

随机推荐

  1. JAVA为什么不能通过构造函数传参来设置数组长度。

     今天我们来说说 JAVA通过构造函数传递的参数来设置数组长度的问题. 问题在于我们没有明确知晓JVM的运行顺序.在new对象的时候,先调用构造函数,但是并没有将执行构造函数的代码,随机之后就初始化了 ...

  2. hdu1856 并查集

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1856/ 题目就是要求并查集中各树的大小的最大值,我们只要在根节点处存树的大小就可以,合并也是合并根节点的数,最后 ...

  3. [最短路,最大流最小割定理] 2019 Multi-University Training Contest 1 Path

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6582 Path Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  4. 搭建Hadoop集群需要注意的问题:

    搭建Hadoop集群需要注意的问题: 1.检查三台主机名是否正确 2.检查三台IP是否正确 3.检查 /etc/hosts 映射是否正确 4.检查 JDK和Hadoop 是否安装成功(看环境变量配置) ...

  5. 用python实现矩阵转置,python3 中zip()函数

    前几天群里有同学提出了一个问题:手头现在有个列表,列表里面两个元素,比如[1, 2],之后不断的添加新的列表,往原来相应位置添加.例如添加[3, 4]使原列表扩充为[[1, 3], [2, 4]],再 ...

  6. [LeetCode] 935. Knight Dialer 骑士拨号器

    A chess knight can move as indicated in the chess diagram below:  .            This time, we place o ...

  7. office的高级应用

    Word高级应用:设置斜线表头(一根:边框:多根:插入形状,按住鼠标拖动). 注意:1.用好样式功能 2.大量重复工作懂得批量处理 3.反复要做的固定操作固化成“模板”“套路” 4.碰到异常情况,知道 ...

  8. 使用TensorFlow v2张量的一个简单的“hello world”示例

    使用TensorFlow v2张量的一个简单的"hello world"示例 import tensorflow as tf # 创建一个张量 hello = tf.constan ...

  9. 4 Values whose Sum is 0 POJ - 2785(二分应用)

    题意:输入一个数字n,代表有n行a,b,c,d,求a+b+c+d=0有多少组情况. 思路:先求出前两个数字的所有情况,装在一个数组里面,再去求后两个数字的时候二分查找第一个大于等于这个数的位置和第一个 ...

  10. 自签SSL证书

    0.介绍 自己开发的使用了SSL协议的软件,通常没必要从证书签发机构那里来获取证书,自签证书成了必要的选择.自签证书还可以用来实现客户端登录认证. 1.创建CA 创建CA的私钥 openssl gen ...