11-14序列化模块之json、pickle、shelve
序列化的目的
- 序列化--转向一个字符串数据类型
序列--及时字符串- 何处用到:
数据存储
网络上传输的时候- 从数据类型到字符串的过程,叫做序列化
从字符串到数据类型的过程,叫做反序列化- 分类
json *****
pickle ****
shelve ***- 特点
json(可以进行序列化的有:数字,字符串,列表,字典,元组(将元组转成序列表进行序列化))
通用的序列化格式
只有很少的一部分数据类型能够通过json转化成字符串
pickle
所有Python中的数据类型都可以转化成字符串形式
pickle序列化的内容只有Python能够理解
且反序列化依赖代码
shelve
序列化句柄
使用句柄直接操作,非常方便
jsonhe和pickle的选择
如果将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
所以,如果序列化的内容是列表或者字典,非常推荐使用json模块
但如果出于某种原因你不得不序列化其他的数据类型,而未来还会用python对这个数据进行反序列化的话,那么就可以使用pickle
1.Json模块
- 提供了四个功能:dumps(序列化方法)、dump、loads(反序列方法)、load
对于json来说,可以分步的dump和load
dumps、loads:对内存中的数据进行操作,数据操作完成后还在内存中
- dic = {'k1':'v1'}
- # dic = (1,2,3)
- print(type(dic),dic) #<class 'dict'> {'k1': 'v1'}
- import json
- str_d = json.dumps(dic)
- print(type(str_d),str_d) #<class 'str'> {"k1": "v1"}
- dic_new = json.loads(str_d)
- print(type(dic_new),dic_new) #<class 'dict'> {'k1': 'v1'}
- print(dic==dic_new) #True
- dump、load:是与文件相关的操作
- import json
- dic = {1:'a',2:'b'}
- f = open('fff','w',encoding='utf-8')
- json.dump(dic,f) #写入文件
- # json.dump(dic,f) #写入文件
- f.close()
- f = open('fff')
- res=json.load(f) #从文件读
- f.close()
- print(type(res),res)
- import json
- dic = {1:'中国',2:'b'}
- f = open('fff','w',encoding='utf-8')
- # json.dump(dic,f) #写入文件
- json.dump(dic,f,ensure_ascii=False) # 写入文件
- f.close()
- f = open('fff',encoding='utf-8')
- res=json.load(f) #从文件读
- f.close()
- print(type(res),res)
- #分次写入
- l = [{'k1':'v1'},{'k2':'v2'},{'k3':'v3'}]
- f = open('file','w')
- import json
- for dic in l:
- str_d = json.dumps(dic)
- f.write(str_d+'\n')
- f.close()
- #分次读出
- f = open('file')
- import json
- l = []
- for line in f:
- dic_new = json.loads(line.strip())
- l.append(dic_new)
- print(l) #[{'k1': 'v1'}, {'k2': 'v2'}, {'k3': 'v3'}]
- f.close()
2.pickle模块
- pickle序列化之后看不出来有何内容(文件必须以wb或者rb文件打开)
对于pickle来说,可以分步的dump和load
- dic = {'k1':'v1','k2':'v2'}
- print(type(dic),dic) #<class 'dict'> {'k1': 'v1', 'k2': 'v2'}
- import pickle
- str_d = pickle.dumps(dic)
- 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.
- dic_new = pickle.loads(str_d)
- print(type(dic_new),dic_new) #<class 'dict'> {'k1': 'v1', 'k2': 'v2'}
- print(dic==dic_new) #True
- import pickle
- import time
- struct_time1 = time.localtime(1000000000)
- struct_time2 = time.localtime(2000000000)
- 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)
- 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)
- f = open('pickle_file','wb')
- pickle.dump(struct_time1,f) #写入文件
- pickle.dump(struct_time2,f) #写入文件
- f.close()
- f = open('pickle_file','rb')
- struct_time1_new = pickle.load(f) #读文件
- struct_time2_new = pickle.load(f) #读文件
- print(struct_time1_new.tm_year) #2001
- print(struct_time2_new.tm_year) #2033
- f.close()
3.shelve模块
- 只提供了一个open方法,用key进行访问,使用起来与字典类似
存文件的方式也是不透明的
- import shelve
- f = shelve.open('shelve_file')
- f['key']={'int':1,'float':0.1,'String':'Sample data'} #直接对文件句柄进行操作就可以直接存入数据
- f.close()
- import shelve
- f1 = shelve.open('shelve_file')
- context = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存则会报错
- f1.close()
- print(context)
由于shelve在默认情况下是不会记录待持久化对象的任何修改的,所以在shelve.open()的时候需要修改默认参数,否则对象的修改不会保存
- import shelve
- f1 = shelve.open('shelve_file')
- # print(f1['key'])
- f1['key']['new_value'] = 'this was not here before'
- f1.close()
- f2 = shelve.open('shelve_file',writeback=True)
- # print(f2['key'])
- f2['key']['new_value'] = 'this was not here before'
- print(f2['key'])
- f2.close()
11-14序列化模块之json、pickle、shelve的更多相关文章
- python 序列化及其相关模块(json,pickle,shelve,xml)详解
什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...
- python序列化及其相关模块(json,pickle,shelve,xml)详解
什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...
- 常用模块---sys&logging&序列化模块(json&pickle)
sys 模块 sys.argv 命令行参数List,第一个元素是程序本身路径,通常用来避免io 阻塞 print('欢迎进入') info=sys.argv ': print('login succe ...
- 模块 序列化模块:json pickle
模块:一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀 模块的形象: 内置模块:安装Python解释器的时候一起安装上的 第三方模块(扩展模块):需要自己安装 自 ...
- python序列化: json & pickle & shelve 模块
一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...
- day6_python序列化之 json & pickle & shelve 模块
一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...
- python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)
一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...
- 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 ...
- 常用模块(random,os,json,pickle,shelve)
常用模块(random,os,json,pickle,shelve) random import random print(random.random()) # 0-1之间的小数 print(rand ...
随机推荐
- 一个很酷炫也挺实用的JS库leader-line
简单粗暴,直入主题,看看效果再说. 是不是这效果挺棒?这样的效果在做系统时,可以有很多的应用,可以让枯燥的页面生动起来. 具体效果,大家可以上这个搜索网站Mag[i]上面看,切身体会一下. 这是一个开 ...
- DBMS_METADATA.GET_DDL查出不存在的列SYS_C00014_20070116:47:09$
DBMS_METADATA.GET_DDL查出不存在的列SYS_C00014_20070116:47:09$ 前言 很久很久以前,有多久呢? 有多久了,等等我看下截图的日期(溜︿( ̄︶ ̄)︿). 哦, ...
- Oracle中truncate表不更新last_ddl_time列
Oracle中truncate表不更新last_ddl_time列 问题描述 最近发现数据库中定时job的某张表,每天都有truncate动作,由于调整了job的interval时间,想查看last_ ...
- 自定义PHPstorm快捷键
这篇随笔介绍一下PHPstorm自定义快捷键的步骤: 1.点击主菜单 File 下的 setting : 2.在弹出框中点击 Keymap : 3.之后会出现如下图所示的界面(图中所有的菜单都折叠了) ...
- C++中string转换为char*类型返回后乱码问题
问题来源: 在写二叉树序列化与反序列化时发现序列化函数为char* Serialize1(TreeNode *root) 其函数返回类型为char*,但是我在实现的过程中为了更方便的操作添加字符串使 ...
- 《Spring全局异常处理》从零掌握@ControllerAdvice注解
一.开门见山 在前后端分离框架的大趋势下,前后端基本的职责已经确定. 前端主要负责界面的处理以及基本的判空检验.数据来源则通过vue调用后端发布的接口. 后端的原型还是mvc的模式: controll ...
- 机器学习实战基础(十七):sklearn中的数据预处理和特征工程(十)特征选择 之 Embedded嵌入法
Embedded嵌入法 嵌入法是一种让算法自己决定使用哪些特征的方法,即特征选择和算法训练同时进行.在使用嵌入法时,我们先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大 ...
- python 装饰器(三):装饰器实例(一)
示例 7-15 定义了一个装饰器,它会在每次调用被装饰的函数时计时,然后把经过的时间.传入的参数和调用的结果打印出来.示例 7-15 一个简单的装饰器,输出函数的运行时间 import time de ...
- JavaScript之setinterval的具体使用
关于setInterval在api文档中也有很详细的解释,比如下面那两个: setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停 ...
- 通过server酱实现定时推送天气情况,再不用担心你的糊涂蛋女友忘带伞了~~
昨天菜鸟小白给大家留了一个课后作业,如何实现天气的定时推送.有没有小伙伴做出来答案呢?今天菜鸟小白给大家分享我的实现方式吧.这个是我今天整的程序流程图,昨天我们还只是实现了中间的通过和风天气API获取 ...