什么是序列?

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

什么是序列化?

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

什么时候会用到序列化?

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

序列化的目的

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

Python学习日记(十八) 序列化模块的更多相关文章

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

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

  2. Python学习日记(八)—— 模块一(sys、os、hashlib、random、time、RE)

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

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

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

  4. Python学习(十) —— 常用模块

    一.collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdic ...

  5. python学习(十二)模块

    怎么一下子就来学了模块? 其实学了判断.循环.函数等知识就可以开始下水写程序了,不用在意其他的细节,等你用到的时候再回过头去看,此所谓囫囵吞枣学习法. 为啥学模块? 有点用的.或者有点规模的程序都是要 ...

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

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

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

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

  8. Python学习二十八周(vue.js)

    一.指令 1.一个例子简单实用vue: 下载vue.js(这里实用1.0.21版本) 编写html代码: <!DOCTYPE html> <html lang="en&qu ...

  9. Python学习第十八篇——低耦合函数设计思想

    import json 2 def greet_user(filename): 3 try: 4 with open(filename) as f_obj: 5 username = json.loa ...

随机推荐

  1. android -------- RSA加密解密算法

    RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用 RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计 ...

  2. ubuntu16上部署confluence-6.14.5的迁移

    author:headsen chen date:  2019-10-18  15:02:06 notice :created  by  headsen chen himself and not al ...

  3. ISO/IEC 9899:2011 条款6.10.1——条件包含

    6.10.1 条件包含 约束 1.控制条件包含的表达式应该是一个整数常量表达式,除了:标识符(包括那些词法上与关键字相同的)被解析为以下所描述的:[注:因为控制常量表达式在翻译阶段4期间被计算,所以所 ...

  4. Python3基础 sys.path 查看与修改导包的路径

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  5. win10 启动后会自动恢复上次关机前的应用

    转载:https://www.v2ex.com/t/425101

  6. postman跳过登陆直接使用的办法

    新版的postman不再是Chrome的插件,而是一个独立的app.下载安装后会提示你注册账户或者登陆.在私有环境,例如实验室,或者单机调试,或者其他VPN隔离的内部环境,无法完成登陆操作. 解决办法 ...

  7. WebAPI.请求(Request)的参数(Parameter)里包含特殊字符(#等)的正确处理方式 从客户端xx中检测到有潜在危险的Request.Form值

    事故现场 报错"从客户端 中检测到有潜在危险的Request.Form值" //后台代码 namespace Test { [RoutePrefix("TestClass ...

  8. JS字符串数字前面加加号会变成数字类型

    JS中一个字符串中只有数字,如果该字符串前面加了个加号,这个数值就变成了number类型.如本文测试中,用lodop打印二维码,最后一个参数是一个字符串,在前面加了加号和不在前面加加号,通过控制台输出 ...

  9. Tomcat启动原理/使用tomcat的应用是如何从tomcat的main函数开始运行的

    从main方法开始打断点,逐步调试,了解程序运行过程 全局唯一的public static void main(String[] args)main Springboot* 内置tomcat,开发的时 ...

  10. Lyrics of the song 99 Bottles of Beer

    99 bottles of beer on the wall, 99 bottles of beer.Take one down and pass it around, 98 bottles of b ...