序列化的目的

1、以某种存储形式使自定义对象持久化
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。
  1. 序列化--转向一个字符串数据类型
    序列--及时字符串
  2.  
  3. 何处用到:
      数据存储
      网络上传输的时候
  4.  
  5. 从数据类型到字符串的过程,叫做序列化
    从字符串到数据类型的过程,叫做反序列化
  6.  
  7. 分类
    json *****
    pickle ****
    shelve ***
  8.  
  9. 特点
    json(可以进行序列化的有:数字,字符串,列表,字典,元组(将元组转成序列表进行序列化))
    通用的序列化格式
    只有很少的一部分数据类型能够通过json转化成字符串
    pickle
    所有Python中的数据类型都可以转化成字符串形式
    pickle序列化的内容只有Python能够理解
    且反序列化依赖代码
    shelve
    序列化句柄
    使用句柄直接操作,非常方便

jsonhe和pickle的选择

json是一种所有的语言都可以识别的数据结构。
如果将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
所以,如果序列化的内容是列表或者字典,非常推荐使用json模块
但如果出于某种原因你不得不序列化其他的数据类型,而未来还会用python对这个数据进行反序列化的话,那么就可以使用pickle
 

1.Json模块

  1. 提供了四个功能:dumps(序列化方法)、dumploads(反序列方法)、load
    对于json来说,可以分步的dumpload
    dumpsloads:对内存中的数据进行操作,数据操作完成后还在内存中
  1. dic = {'k1':'v1'}
  2. # dic = (1,2,3)
  3. print(type(dic),dic) #<class 'dict'> {'k1': 'v1'}
  4. import json
  5. str_d = json.dumps(dic)
  6. print(type(str_d),str_d) #<class 'str'> {"k1": "v1"}
  7. dic_new = json.loads(str_d)
  8. print(type(dic_new),dic_new) #<class 'dict'> {'k1': 'v1'}
  9. print(dic==dic_new) #True
  10.  
  11. dumpload:是与文件相关的操作
  12. import json
  13. dic = {1:'a',2:'b'}
  14. f = open('fff','w',encoding='utf-8')
  15. json.dump(dic,f) #写入文件
  16. # json.dump(dic,f) #写入文件
  17. f.close()
  18.  
  19. f = open('fff')
  20. res=json.load(f) #从文件读
  21. f.close()
  22. print(type(res),res)
  23.  
  24. import json
  25. dic = {1:'中国',2:'b'}
  26. f = open('fff','w',encoding='utf-8')
  27. # json.dump(dic,f) #写入文件
  28. json.dump(dic,f,ensure_ascii=False) # 写入文件
  29. f.close()
  30.  
  31. f = open('fff',encoding='utf-8')
  32. res=json.load(f) #从文件读
  33. f.close()
  34. print(type(res),res)
  35.  
  36. #分次写入
  37. l = [{'k1':'v1'},{'k2':'v2'},{'k3':'v3'}]
  38. f = open('file','w')
  39. import json
  40. for dic in l:
  41. str_d = json.dumps(dic)
  42. f.write(str_d+'\n')
  43. f.close()
  44.  
  45. #分次读出
  46. f = open('file')
  47. import json
  48. l = []
  49. for line in f:
  50. dic_new = json.loads(line.strip())
  51. l.append(dic_new)
  52. print(l) #[{'k1': 'v1'}, {'k2': 'v2'}, {'k3': 'v3'}]
  53. f.close()

2.pickle模块

  1. pickle序列化之后看不出来有何内容(文件必须以wb或者rb文件打开)
    对于pickle来说,可以分步的dumpload
  1. dic = {'k1':'v1','k2':'v2'}
  2. print(type(dic),dic) #<class 'dict'> {'k1': 'v1', 'k2': 'v2'}
  3. import pickle
  4. str_d = pickle.dumps(dic)
  5. print(type(str_d),str_d) #<class 'bytes'> b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04u.
  6. dic_new = pickle.loads(str_d)
  7. print(type(dic_new),dic_new) #<class 'dict'> {'k1': 'v1', 'k2': 'v2'}
  8. print(dic==dic_new) #True
  9.  
  10. import pickle
  11. import time
  12. struct_time1 = time.localtime(1000000000)
  13. struct_time2 = time.localtime(2000000000)
  14. print(struct_time1) #time.struct_time(tm_year=2001, tm_mon=9, tm_mday=9, tm_hour=9, tm_min=46, tm_sec=40, tm_wday=6, tm_yday=252, tm_isdst=0)
  15. print(struct_time2) #time.struct_time(tm_year=2033, tm_mon=5, tm_mday=18, tm_hour=11, tm_min=33, tm_sec=20, tm_wday=2, tm_yday=138, tm_isdst=0)
  16. f = open('pickle_file','wb')
  17. pickle.dump(struct_time1,f) #写入文件
  18. pickle.dump(struct_time2,f) #写入文件
  19. f.close()
  20.  
  21. f = open('pickle_file','rb')
  22. struct_time1_new = pickle.load(f) #读文件
  23. struct_time2_new = pickle.load(f) #读文件
  24. print(struct_time1_new.tm_year) #2001
  25. print(struct_time2_new.tm_year) #2033
  26. f.close() 

3.shelve模块

  1. 只提供了一个open方法,用key进行访问,使用起来与字典类似
    存文件的方式也是不透明的
  1. import shelve
  2. f = shelve.open('shelve_file')
  3. f['key']={'int':1,'float':0.1,'String':'Sample data'} #直接对文件句柄进行操作就可以直接存入数据
  4. f.close()
  5.  
  6. import shelve
  7. f1 = shelve.open('shelve_file')
  8. context = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存则会报错
  9. f1.close()
  10. print(context)

 由于shelve在默认情况下是不会记录待持久化对象的任何修改的,所以在shelve.open()的时候需要修改默认参数,否则对象的修改不会保存

  1. import shelve
  2. f1 = shelve.open('shelve_file')
  3. # print(f1['key'])
  4. f1['key']['new_value'] = 'this was not here before'
  5. f1.close()
  6.  
  7. f2 = shelve.open('shelve_file',writeback=True)
  8. # print(f2['key'])
  9. f2['key']['new_value'] = 'this was not here before'
  10. print(f2['key'])
  11. f2.close()

  

11-14序列化模块之json、pickle、shelve的更多相关文章

  1. python 序列化及其相关模块(json,pickle,shelve,xml)详解

    什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...

  2. python序列化及其相关模块(json,pickle,shelve,xml)详解

    什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...

  3. 常用模块---sys&logging&序列化模块(json&pickle)

    sys 模块 sys.argv 命令行参数List,第一个元素是程序本身路径,通常用来避免io 阻塞 print('欢迎进入') info=sys.argv ': print('login succe ...

  4. 模块 序列化模块:json pickle

    模块:一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀 模块的形象: 内置模块:安装Python解释器的时候一起安装上的 第三方模块(扩展模块):需要自己安装 自 ...

  5. python序列化: json & pickle & shelve 模块

    一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...

  6. day6_python序列化之 json & pickle & shelve 模块

    一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...

  7. python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)

    一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...

  8. python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

  9. 常用模块(random,os,json,pickle,shelve)

    常用模块(random,os,json,pickle,shelve) random import random print(random.random()) # 0-1之间的小数 print(rand ...

随机推荐

  1. 一个很酷炫也挺实用的JS库leader-line

    简单粗暴,直入主题,看看效果再说. 是不是这效果挺棒?这样的效果在做系统时,可以有很多的应用,可以让枯燥的页面生动起来. 具体效果,大家可以上这个搜索网站Mag[i]上面看,切身体会一下. 这是一个开 ...

  2. DBMS_METADATA.GET_DDL查出不存在的列SYS_C00014_20070116:47:09$

    DBMS_METADATA.GET_DDL查出不存在的列SYS_C00014_20070116:47:09$ 前言 很久很久以前,有多久呢? 有多久了,等等我看下截图的日期(溜︿( ̄︶ ̄)︿). 哦, ...

  3. Oracle中truncate表不更新last_ddl_time列

    Oracle中truncate表不更新last_ddl_time列 问题描述 最近发现数据库中定时job的某张表,每天都有truncate动作,由于调整了job的interval时间,想查看last_ ...

  4. 自定义PHPstorm快捷键

    这篇随笔介绍一下PHPstorm自定义快捷键的步骤: 1.点击主菜单 File 下的 setting : 2.在弹出框中点击 Keymap : 3.之后会出现如下图所示的界面(图中所有的菜单都折叠了) ...

  5. C++中string转换为char*类型返回后乱码问题

    问题来源: 在写二叉树序列化与反序列化时发现序列化函数为char* Serialize1(TreeNode *root)  其函数返回类型为char*,但是我在实现的过程中为了更方便的操作添加字符串使 ...

  6. 《Spring全局异常处理》从零掌握@ControllerAdvice注解

    一.开门见山 在前后端分离框架的大趋势下,前后端基本的职责已经确定. 前端主要负责界面的处理以及基本的判空检验.数据来源则通过vue调用后端发布的接口. 后端的原型还是mvc的模式: controll ...

  7. 机器学习实战基础(十七):sklearn中的数据预处理和特征工程(十)特征选择 之 Embedded嵌入法

    Embedded嵌入法 嵌入法是一种让算法自己决定使用哪些特征的方法,即特征选择和算法训练同时进行.在使用嵌入法时,我们先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大 ...

  8. python 装饰器(三):装饰器实例(一)

    示例 7-15 定义了一个装饰器,它会在每次调用被装饰的函数时计时,然后把经过的时间.传入的参数和调用的结果打印出来.示例 7-15 一个简单的装饰器,输出函数的运行时间 import time de ...

  9. JavaScript之setinterval的具体使用

    关于setInterval在api文档中也有很详细的解释,比如下面那两个: setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停 ...

  10. 通过server酱实现定时推送天气情况,再不用担心你的糊涂蛋女友忘带伞了~~

    昨天菜鸟小白给大家留了一个课后作业,如何实现天气的定时推送.有没有小伙伴做出来答案呢?今天菜鸟小白给大家分享我的实现方式吧.这个是我今天整的程序流程图,昨天我们还只是实现了中间的通过和风天气API获取 ...