序列化模块和hashlib模块
一:序列化模块
1,什么叫序列化?
序列化就是将原本的字典、列表等内容转换成一个字符串。python中的序列化模块有 json,pickle,shelve。
ps:能存储在文件中的一定是字符串或者是字节,能在网络上传输的只有字节。
2,为什么要进行序列化?
因为在网络上和文件中能存在的只有字节
3,json模块
所有的编程语言都通用的序列化格式,但它支持的数据类型非常有限(数字 字符串 列表 字典)
Json模块提供了四个功能:dumps、dump、loads、load
(1) dumps和loads
import json dic = {"张三":(190,90)} # 序列化 ret = json.dumps(dic,ensure_ascii=False) #将字典转化为str print(type(dic),dic) print(type(ret),ret) # 反序列化 res = json.loads(ret) #将str转化为字典 print(type(res),res)
dumps和loads
(2) dump和load 是直接将对象序列化之后写入文件,依赖一个文件句柄
import json dic = {"大表哥":(190,90)} f = open('大表哥','w',encoding='utf-8') json.dump(dic,f,ensure_ascii=False) # 先接收要序列化的对象 再接受文件句柄 f.close()f = open('大表哥','r',encoding='utf-8') ret = json.load(f) print(type(ret),ret)
dump和load
import json data = {'username':['李华','二愣子'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators(',',':'),ensure_ascii=False) print(json_dic2)
View Code
ps:dumps序列化 loads反序列化 只在内存中操作数据 主要用于网络传输 和多个数据与文件打交道
dump序列化 load反序列化 主要用于一个数据直接存在文件里—— 直接和文件打交道
import json dic1 = {"大表哥":(190,90)} dic2 = {"2表哥":(190,90)} dic3 = {"3表哥":(190,90)} f = open('大表哥','a',encoding='utf-8') str1 = json.dumps(dic1) f.write(str1+'\n') str2 = json.dumps(dic2) f.write(str2+'\n') str3 = json.dumps(dic3) f.write(str3+'\n') f.close()f = open('大表哥','r',encoding='utf-8') for line in f:print(json.loads(line.strip())) f.close()
View Code
4,pickle模块
只能在python语言的程序之间传递数据,它支持python中所有的数据类型
import pickle dic = {(190,90):"大表哥"} ret = pickle.dumps(dic) # 序列化结果 不是一个可读的字符串 而是一个bytes类型 print(ret) print(pickle.loads(ret))
dumps
import pickle dic = {(190,90):"大表哥"} f = open('大表哥2','wb') # 使用pickle dump必须以+b的形式打开文件 pickle.dump(dic,f) f.close()
dump
#关于写多行 import pickle dic1 = {"大表哥":(190,90)} dic2 = {"2表哥":(190,90)} dic3 = {"3表哥":(190,90)} f = open('大表哥3','wb') pickle.dump(dic1,f) pickle.dump(dic2,f) pickle.dump(dic3,f) f.close() # 读写入的多行 f = open('大表哥3','rb') while True:try:print(pickle.load(f))except EOFError:break
关于写多行和读多行
ps:json 在写入多次dump的时候 不能对应执行多次load来取出数据,pickle可以。json 如果要写入多个元素 可以先将元素dumps序列化,f.write(序列化+'\n')写入文件。读出元素的时候,应该先按行读文件,在使用loads将读出来的字符串转换成对应的数据类型。
class A:def __init__(self,name,age):self.name=nameself.age=age a = A('张三',18) import pickle f = open('大侄子1','wb') pickle.dump(a,f) f.close() f = open('大侄子1','rb') obj = pickle.load(f) print(obj.__dict__)
对类的对象进行序列化1
class A:def __init__(self,name,age):self.name=nameself.age=age a = A('张三',18) import pickle ret = pickle.dumps(a) print(ret) obj = pickle.loads(ret) print(obj.__dict__)
对类的对象进行序列化2
5,shelve模块
python 专有的序列化模块 只针对文件
import shelve # python 专有的序列化模块 只针对文件 f = shelve.open('shelve_file') # 打开文件 f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'} #直接对文件句柄操作,就可以存入数据 f.close()f = shelve.open('shelve_file', flag='r') f['key']['int'] = 50 # 不能修改已有结构中的值 f['key']['new'] = 'new' # 不能在已有的结构中添加新的项 f['key'] = 'new' # 但是可以覆盖原来的结构 existing = f['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错 f.close() print(existing) f.close()
View Code
6,hashlib模块
(1) hashlib是一种摘要算法,它能将字符串转化为数字,对于不同的算法,转化的数字一定不相同,无论在哪台机器上,在什么时候计算,对相同的字符串结果总是一样的。而且该摘要过程不可逆。
(2) hashlib算法应用于文件的一致性校验,密文验证的时候的加密
import hashlib m = hashlib.md5() m.update('dazhizi'.encode('utf-8')) print(m.hexdigest())
密文验证时候的加密
import hashlib m = hashlib.md5('wahaha'.encode('utf-8')) m.update('123456'.encode('utf-8')) print(m.hexdigest())
加盐
username = 'alex' m = hashlib.md5(username[:2:2].encode('utf-8')) m.update('123456'.encode('utf-8')) print(m.hexdigest())
动态加盐
md5obj = hashlib.md5() md5obj.update(b'hello,') md5obj.update(b'alex,') md5obj.update(b'I know your ') md5obj.update(b'password is alex3714') print(md5obj.hexdigest()) # 一段字符串直接进行摘要和分成几段摘要的结果是相同的
文件的一致性校验
import hashlib def check(filename):md5obj = hashlib.md5()with open(filename,'rb') as f:content = f.read()md5obj.update(content)return md5obj.hexdigest()#适合两个文件较大时的一致性校验 def check(filename):md5obj = hashlib.md5()with open(filename,'rb') as f:while True:content = f.read(4096)if content:md5obj.update(content)else:breakreturn md5obj.hexdigest()ret1 = check('file1') ret2 = check('file2') print(ret1) print(ret2)
两个文件的一致性校验
7,几种序列化模块的比较
序列化就是把数据类型转化为字符串。
(1)json,在所有语言中通用 ,只对有限的数据类型进行序列化 字典 列表 字符串 数字 元组。在多次写入dump数据进入文件的时候,不能通过load来取。
(2)pickle,只能在python中使用 对绝大多数数据类型都可以进行序列化,在load的时候,必须拥有被load数据类型对应的类在内存里。
# dumps 序列化# loads 反序列化# dump 直接向文件中序列化# load 直接对文件反序列化
转载于:https://www.cnblogs.com/leiwei123/p/8893500.html
序列化模块和hashlib模块相关推荐
- python hashlib模块_python3 hashlib模块
Python3 hashlib模块和hmac 模块(加密) hashlib 是一个提供了一些流行的hash算法的 Python 标准库.其中所包括的算法有 md5, sha1, sha224, sha ...
- python之time模块和hashlib模块
一.time模块 import time print(time.strftime('%Y-%m-%d %H:%M:%S'))#获取当前的格式化时间,time.strftime(format) prin ...
- Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块...
一.前提介绍: 可以开辟作用域的只有类,函数,和模块 for循环 if,else: 不能开辟自己的作用域 避免程序复用和重复调用,将这些写到一个.py文件中,做成一个模块,进行调 ...
- re模块,hashlib模块
import re print(re.findall('alex','hahahah alex is alex is dsb')) alex print(re.findall('\w','Aah123 ...
- md5模块和hashlib模块
注释: md5模块以及过时了, 用hashlib模块来加密. hashlib是个专门提供hash算法的库,现在里面包括md5, sha1, sha224, sha256, sha384, sha512 ...
- Python模块学习——hashlib模块讲解
一:hashlib简介 1.什么叫hash: hash是一种算法(不同的hash算法只是复杂度不一样)(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SH ...
- Python常用模块之hashlib模块
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示). ...
- 模块之hashlib模块
转载于:https://www.cnblogs.com/yuexijun/p/10090660.html
- 4-20模块 序列化模块 hashlib模块
1,模块,py文件就是模块,py之所以好用就是模块多. 2,模块的分类: 1,内置模块,python 安装时自带的模块 2,扩展模块,别人写好的,需要安装之后,可以直接使用.itchat微信模块, b ...
最新文章
- jenkins插件之Publish Over FTP
- Git删除分支/恢复分支
- sqlite mysql php_PHP实现的简单操作SQLite数据库类与用法示例
- Centos7 Greenplum6.1开源版本集群部署
- IE浏览器中Image对象onload失效的解决办法
- 三年Java开发经验,必须要掌握的知识技能树有哪些?
- ARTetris-AR版俄罗斯方块的源码解析
- Java API下载和查阅方法
- 导数与微分的知识点思维导图_高中物理思维导图,高中三年知识点一个不漏
- 全国最新省市县联动mysql_全国省市县区三级联动数据库mysql3500条数据-html资源网...
- c语言指向指针的指针
- 反垄断重锤字节跳动,投资业务原地熄火 腾讯阿里争做“普通公司”
- fgo服务器维护 石头,FGO发石头玩家的四种表现 第三种要注意了
- 微信小程序获取验证码
- 致加西亚的信 谁动了我的奶酪
- 计算机音乐蜗牛与黄鹂鸟,音乐教材《蜗牛与黄鹂鸟》教案
- 微信内置浏览器清除缓存
- 小学计算机期末考试试题,小学三年级信息技术期末考试试卷
- 游戏服务器设计(C#)简单版
- 1、Neural Rendering
热门文章
- Mybatis的入门到精通这一篇文章就够了
- android的交互方式,Android与js的交互方式
- 什么是pisa测试_PISA测试排名世界第一,中国教育已是世界冠军?
- 为什么最近python很火_最近python挺火的,也来凑凑热闹。
- python常用的库_这几个常用的python库你需要知道
- cadence 常见pcb电阻_高速PCB培训手记
- linux系统ftp优化,Linux vsftp 部署优化
- gradle 引入jar时自动引入父依赖_原创 | 看完此文,你对Gradle的理解又升级了
- 开发浏览器监控网页数据变化_贝程学院:Selenium辅助开发工具Firebug和Firepath
- 报错,o.h.engine.jdbc.spi.SqlExceptionHelper : Unknown column ‘org0_.create_by‘ in ‘field list‘