Python之路【第二十篇】:pickle与json模块、hashlib模块
序列化是指将对象、数据结构的状态信息转换为可以存储或传输的形式的过程。
我们编写的程序,会涉及到各种各样的对象、数据结构,它们通常是以变量的形式在内存中存在着。当程序运行结束后,这些变量也就会被清理。但我们有时希望能够在下一次编写程序时恢复上一次的某个对象(如机器学习中的到结果,需要程序运行较长时间,多次运行时间成本太大),这就需要我们将变量进行持久化的存储。一种方式是利用文件读写的方式将变量转化为某种形式的字符串写入文件内,但需要自己控制存储格式显得十分笨拙。更好的方式是通过序列化的方式将变量持久化至本地。
pickle模块
pickle.dumps()
pickle.loads()
pickle.dump()
pickle.load()
pickle就这四个功能,dump和load仅适用于文件操作,对文件的操作比dumps和loads更简单,但是dumps和loads除了文件操作还有别的
json只能处理python的基本类型,pickle可以处理的类型比json多,比如常见的游戏存档功能,就应该使用pickle而不是用json
json模块
我们给服务器发送请求,服务器给我们返回值,记住,返回的永远是字符串
json就是字符串,跨语言,跨平台交互的时候,一把都用json,
json处理字典,列表形式的字符串时(返回值是xml时用xml模块进行处理,html直接用浏览器进行处理),如果内部元素也是字符串,必须是双引号
与pickle用法基本一样,只不过名字改了
json.dumps(),用于将字典,列表等转换成相应形式的字符串
json.dump(),用于将字典,列表等转换成相应形式的字符串,再写入文件
json.loads(),用于将字典,列表形式的字符串,转换成相应的字典,列表
json.load(),接受一个文件路径,读取文件内容(字典,列表形式的字符串)再转换成列表,字典
dump,load就是接受文件路径,多了文件操作,用的比较少,重点还是loads与dumps
#!/usr/bin/env python # -*- coding:utf-8 -*- import json dic = {'alex':1,'eric':2} s = json.dumps(dic) print(s,type(s)) dic_s = '{"alex":1,"eric":2}'#在这里,alex,eric要加双引号,如果是单引号会出错 dic = json.loads(dic_s) print(dic,type(dic))
输出结果为:
{"eric": 2, "alex": 1} <class 'str'>
{'eric': 2, 'alex': 1} <class 'dict'>
注意:下面这种loads方式会出错,因为元组不是一种通用的数据格式,列表跟字典是通用的,才可以
import json s = '(11,22,33,44,"alex")' n = json.loads(s)
import json s = (11,22,33,44,"alex") n = json.dumps(s) print(n)
输出结果为:
[11, 22, 33, 44, "alex"],元组,dumps后变成了列表
hashlib模块
用于加密相关的操作,代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法
密码不管放到哪里,一定不要用明文
对于MD5来说,不能反解
还有一个hmac模块,其实与第二种md5加密一样,只是一种简单的写法,加密的时候推荐第二种md5加密
hash1 = hashlib.md5(bytes('ronghe',encoding='utf-8'))#创建一个MD5对象
hash1.update(bytes('123',encoding='utf-8'))#要加密的对象放在这
print(hash1.hexdigest())#拿到加密后的密码
#!/usr/bin/env python # -*- coding:utf-8 -*- import hashlib hash1 = hashlib.md5()#创建一个MD5对象 hash1.update(bytes('123',encoding='utf-8'))#要加密的对象放在这 print(hash1.hexdigest())#拿到加密后的密码 #下面的代码加了一个自己的字符串,更加保密,可以有效防止暴力破解
#hmac模块加密只是这种方法的简便写法,以后加密就推荐用下面的这种加密方法
hash1 = hashlib.md5(bytes('ronghe',encoding='utf-8'))#创建一个MD5对象 hash1.update(bytes('123',encoding='utf-8'))#要加密的对象放在这 print(hash1.hexdigest())#拿到加密后的密码