什么是序列?

就是每一个元素被有序的排成一列

什么是序列化?

就是将原本的列表、字典等内容转化成字符串的过程

什么时候会用到序列化?

数据存储(把数据放在文件、数据库),网络传输等

序列化的目的

1.以某种存储形式使自定义对象持久化

2.将对象从一个地方传递到另一个地方

3.使程序更具维护性

序列化:数据结构转换成字符串

反序列化:字符串转换成数据结构

三大序列化模块:

1.Json

特点:

json是一个通用的序列化格式且只有很少一部分数据(str、list、dict、tuple、数字)类型能够通过json转化成字符串

json.dumps():

方法使用序列化,将一个数据类型转化成字符串类型

import json
dic = {'k1': 2,'k2': 3 }
str_d = json.dumps(dic)
print(type(str_d),str_d)      #<class 'str'> {"k1": 2, "k2": 3}

元祖的序列化:

在json这里元祖会被转成列表再去序列化

import json
tu = (1,'a',['y',2])
print(type(tu),tu)              #<class 'tuple'> (1, 'a', ['y', 2])
str_t = json.dumps(tu)
print(type(str_t),str_t)        #<class 'str'> [1, "a", ["y", 2]]

json.loads():

方法使用反序列化,将一个字符串类型还原成原数据类型

import json
str_d = '{"k1": 2, "k2": 3}'
dict = json.loads(str_d)
print(type(dict),dict)      #<class 'dict'> {'k1': 2, 'k2': 3}

这里字符串内部的键值要""表示,否则会报错

元祖的反序列化:

结果会转成一个列表,可以用list()方法再转成元祖

json.dump():

接收文件句柄和数据类型,再将该数据类型转换成json字符串写入文件中

import json
dic = {'k1' : 1,'k2' : 2,'k3' : 3}
with open('jsonTestfile','w',encoding='utf-8') as f:json.dump(dic,f)

程序执行前:

程序执行后:

json.load():

接收一个文件句柄,将文件中json字符串转成数据结构返回

import json
with open('jsonTestfile') as f:get_str = json.load(f)
print(get_str)      #{'k1': 1, 'k2': 2, 'k3': 3}

如果这个文件有汉字等非ASCII的字符,文件会被写成一个bytes类型

import json
dic = {'k1':'中国','k2':'美国','k3':123,'k4':'abc1'}
with open('jsonTestFile','w',encoding='utf-8') as f:json.dump(dic,f,ensure_ascii=False)     #关闭ensure_ascii这样汉字就不变成乱码了
with open('jsonTestFile',encoding='utf-8') as f:print(json.load(f))                     #{'k1': '中国', 'k2': '美国', 'k3': 123, 'k4': 'abc1'}

总结:

在这里从文件写入一个json支持的数据类型或从中取出一个json字符串,这里用到的方法dumps\loads都是从内存中直接取出想要的数据,dump\load则都是从文件中取出想要的数据

前面所归纳到的方法都只能一行一行去获取数据,如果我们要多行获取:

import json
l = [{'k1':'a','k2':'b','k3':1}]
#将每一个列表中的字典迭代获取并转成json字符串并以分行格式写入文件
with open('jsonTestFile','w') as f:for dic in l:str_dic = json.dumps(dic)f.write(str_dic+'\n')
#打开这个文件将里面的字符串每行去换行再存入到收集器中,最后再打印结果
with open('jsonTestFile') as f:colletion = []for line in f:dic = json.loads(line.strip())colletion.append(dic)
print(colletion)        #[{'k1': 'a', 'k2': 'b', 'k3': 1}]

2.Pickle

特点:

pickle可以将所有的python中的数据类型转成字符串形式,pickle序列化的内容只有python才能够理解,且部分序列化依赖python代码

pickle.dumps()

将一个数据类型转换成二进制内容,这里dumps()的参数支持python内的所有数据类型

import pickle
dic = {'k1': 1,'k2': 2,'k3': 3}
set = {1,2,'s'}
tu = (1,2,'avb')
li = ['k',1,'s',666]pstr_d = pickle.dumps(dic)
print(type(pstr_d),pstr_d)  #<class 'bytes'> b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K\x01X\x02\x00\x00\x00k2q\x02K\x02X\x02\x00\x00\x00k3q\x03K\x03u.'
pstr_s = pickle.dumps(set)
print(type(pstr_s),pstr_s)  #<class 'bytes'> b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02X\x01\x00\x00\x00sq\x02e\x85q\x03Rq\x04.'
pstr_t = pickle.dumps(tu)
print(type(pstr_t),pstr_t)  #<class 'bytes'> b'\x80\x03K\x01K\x02X\x03\x00\x00\x00avbq\x00\x87q\x01.'
pstr_l = pickle.dumps(li)
print(type(pstr_l),pstr_l)  #<class 'bytes'> b'\x80\x03]q\x00(X\x01\x00\x00\x00kq\x01K\x01X\x01\x00\x00\x00sq\x02M\x9a\x02e.'

pickle.loads()

将读取到的这一个二进制文件转换为数据类型

import pickle
pstr_d = b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K\x01X\x02\x00\x00\x00k2q\x02K\x02X\x02\x00\x00\x00k3q\x03K\x03u.'
print(pickle.loads(pstr_d))     #{'k1': 1, 'k2': 2, 'k3': 3}
pstr_s = b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02X\x01\x00\x00\x00sq\x02e\x85q\x03Rq\x04.'
print(pickle.loads(pstr_s))     #{1, 2, 's'}
pstr_t = b'\x80\x03K\x01K\x02X\x03\x00\x00\x00avbq\x00\x87q\x01.'
print(pickle.loads(pstr_t))     #(1, 2, 'avb')
pstr_l = b'\x80\x03]q\x00(X\x01\x00\x00\x00kq\x01K\x01X\x01\x00\x00\x00sq\x02M\x9a\x02e.'
print(pickle.loads(pstr_l))     #['k', 1, 's', 666]

pickle.dump()

import pickle,time
struct_time = time.gmtime(15000000)
print(struct_time)      #time.struct_time(tm_year=1970, tm_mon=6, tm_mday=23, tm_hour=14, tm_min=40, tm_sec=0, tm_wday=1, tm_yday=174, tm_isdst=0)
with open('pickleTestFile','wb') as f:pickle.dump(struct_time,f)

pickle.load()

import pickle,time
struct_time = time.gmtime(15000000)
with open('pickleTestFile','rb') as f:print(pickle.load(f))#time.struct_time(tm_year=1970, tm_mon=6, tm_mday=23, tm_hour=14, tm_min=40, tm_sec=0, tm_wday=1, tm_yday=174, tm_isdst=0)

3.Shelve

特点:

shelve可以序列化句柄,可以使用句柄直接操作非常方便

直接创建一个shelve对象

import shelve
f = shelve.open('shelveFile')
f['key'] = {'int': 10,'float': 15.6,'string' :'abc123'}
f.close()

固定生成三个shelve专属的文件

取出存入DB中的数据

import shelve
f = shelve.open('shelveFile')
getData = f['key']
f.close()
print(getData)      #{'int': 10, 'float': 15.6, 'string': 'abc123'}

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

关于shelve的学习链接:https://www.cnblogs.com/sui776265233/p/9225164.html#_label2

转载于:https://www.cnblogs.com/Fantac/p/11441326.html

Python学习日记(十八) 序列化模块相关推荐

  1. Python学习日记(十六) time模块和random模块

    time模块 python表示时间的三种方式:时间戳.元祖(struct_time).格式化时间字符串 三种格式之间的转换: 1.时间戳 就是从1970年1月1日0点0分0秒开始按秒计算的偏移量,时间 ...

  2. Python学习日记(十五) collections模块

    在内置函数(dict.list.set.tuple)的基础上,collections模块还提供了几个其他的数据类型:Counter.deque.defaultdict.namedtuple和Order ...

  3. Python学习日记(十四) 正则表达式和re模块

    正则表达式: 它是字符串的一种匹配模式,用来处理字符串,可以极大地减轻处理一些复杂字符串的代码量 字符组:它是在同一位置可能出现的各种字符组成了一个字符组,用[]表示,但是它的结果只能是一个数字或者一 ...

  4. Python学习日记(十九) 模块导入

    模块导入 当文件夹中有这样一个自定义的command模块 在它的内部写下下列代码: print('这个py文件被调用!') def fuc():print('这个函数被调用!') 然后我们在comma ...

  5. python学习第十三节:模块

    1:什么是模块:模块是最高级比的程序组织单元,之前学习的类,可以封装属性和方法,函数,可以封装方法,而模块,可以封装一切 2:定义变量要用赋值语句,封装函数要用def语句,封装类需要用class语句, ...

  6. Python学习日记(十) 生成器和迭代器

    使用dir()我们可以知道这个数据类型的内置函数有什么方法: print(dir(int)) print(dir(bool)) print(dir([])) print(dir({})) print( ...

  7. 【Python学习系列十八】基于scikit-learn库逻辑回归训练模型(delta比赛代码3)

    为了得到一致假设而使假设变得过度严格称为过拟合.避免过拟合是分类器设计中的一个核心任务.通常采用增大数据量和测试样本集的方法对分类器性能进行评价.由于比赛中样本量是一致,目标测试集也是既定,所以我的思 ...

  8. python学习(十八) 程序打包

    18.1  Distutils基础 18.2 打包 18.2.1 建立存档文件 18.2.2 创建Windows安装程序或RPM包 18.3 编译扩展 18.4 使用py2exe创建可执行程序 转载于 ...

  9. python学习日记2-3周

    python学习日记2-3周 怠惰怠惰 improt 导入 import phone.apple.iphone6 import phone.apple.iphone7 import phone.sam ...

最新文章

  1. linux nmon
  2. 哥调的不是车,是寂寞
  3. py-faster-rcnn代码roidb.py的解读
  4. 朴素贝叶斯--文档分类
  5. 计算机如何学会自动地进行图像美学增强?
  6. 什么是API文档?--斯科特·马文
  7. 真有钱!科大讯飞年中分红:共派发现金红利2.2亿元
  8. 计算机共享文件怎样添加,怎么添加另一台电脑的共享文件夹
  9. 【转载】在.NET环境中实现每日构建--NAnt篇
  10. Eclipse创建的JSP文件链接SQLServer2012的方法(附图)
  11. Remote使用出现的问题及解决办法
  12. Flutter CircularProgressIndicator圆形进度指示器
  13. [敏捷开发培训] Scrum 和 Kanban
  14. php做点名系统怎么做,做了个简单点名器
  15. 《30而已》烂尾,如果这样卖空山茶,顾佳会逆袭
  16. 乐视max70老款_这货是电视?超大尺寸乐视TV Max70试玩
  17. csv文件导入Mysql
  18. 软件构造期末复习知识点整理
  19. 常见浏览器User-Agent大全(转载)
  20. 读书笔记—1分钟和陌生人成为朋友

热门文章

  1. Delphi7简单DirectUI界面源码
  2. Guitar Pro 8吉他新版功能特性简介
  3. cobbler+kickstart
  4. [数据集][目标检测]天牛数据集目标检测数据集VOC格式3050张
  5. java正则表达式基础 关于特殊字符、捕获组和非捕获匹配
  6. 沈孝钧计算机算法基础答案,计算机算法基础教学课件ppt作者沈孝钧第14章-PPT-N2课件.pptx...
  7. 将xmind文件内容导出为Excel文件
  8. GRU(Gated recurrent unit)
  9. 关于一个c语言入门感言
  10. windows批处理文件转义字符