Day25
1、json模块
三种
内置模块 python安装的时候自带的
扩展模块 itchat # 别人写好的 需要安装之后可以直接使用
beautiful soap
selenium 网页自动化测试工具
django tornado
自定义模块 自己写的模块
内置模块
序列化模块
hashlib模块
序列化模块
能存储在文件中的一定是字符串 或者是 字节
能在网络上传输的 只有字节
dic --> 字符串 # 序列化
字符串 --> dic # 反序列化
序列化 == 创造一个序列 ==》创造一个字符串
实例化 == 创造一个实例
python中的序列化模块
json 所有的编程语言都通用的序列化格式
它支持的数据类型非常有限 数字 字符串 列表 字典
pickle 只能在python语言的程序之间传递数据用的
pickle支持python中所有的数据类型
shelve python3.* 之后才有的
dumps序列化 loads反序列化 只在内存中操作数据 主要用于网络传输 和多个数据与文件打交道
dump序列化 load反序列化 主要用于一个数据直接存在文件里—— 直接和文件打交道
json不支持元组 不支持除了str数据类型之外的key
json 在写入多次dump的时候 不能对应执行多次load来取出数据,pickle可以
json 如果要写入多个元素 可以先将元素dumps序列化,f.write(序列化+'\n')写入文件
读出元素的时候,应该先按行读文件,在使用loads将读出来的字符串转换成对应的数据类型
import json dic = {"大表哥":(190,90,'捏脚')} 序列化 ret = json.dumps(dic,ensure_ascii=False) print(type(dic),dic) print(type(ret),ret) print('*',str(dic)) # 土办法 反序列化 res = json.loads(ret) print(type(res),res) # dump和load 是直接将对象序列化之后写入文件 # 依赖一个文件句柄 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)
data = {'username':['李华','二愣子'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False) print(json_dic2)
# 3个字典 dic1 = {"大表哥":(190,90,'捏脚')} dic2 = {"2表哥":(190,90,'捏脚')} dic3 = {"3表哥":(190,90,'捏脚')} str1 = json.dumps(dic1) 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()
2、pickle模块
import pickle dic = {(190,90,'捏脚'):"大表哥"} ret = pickle.dumps(dic) # 序列化结果 不是一个可读的字符串 而是一个bytes类型 print(ret) print(pickle.loads(ret)) dic = {(190,90,'捏脚'):"大表哥"} f = open('大表哥2','wb') # 使用pickle dump必须以+b的形式打开文件 pickle.dump(dic,f) f.close() f = open('大表哥2','rb') print(pickle.load(f)) f.close()
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
#关于序列化自定义类的对象 class A: def __init__(self,name,age): self.name=name self.age=age a = A('alex',80) import json json.dumps(a) import pickle ret = pickle.dumps(a) print(ret) obj = pickle.loads(ret) print(obj.__dict__) import pickle f = open('大侄子1','wb') pickle.dump(a,f) f.close() f = open('大侄子1','rb') obj = pickle.load(f) print(obj.__dict__)
3、shelve模块
import shelve # python 专有的序列化模块 只针对文件 f = shelve.open('shelve_file') # 打开文件 f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'} #直接对文件句柄操作,就可以存入数据 f.close() import shelve f1 = shelve.open('shelve_file') existing = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错 f1.close() print(existing)
#设置只读方式 import shelve f = shelve.open('shelve_file', flag='r') existing = f['key'] f.close() print(existing)
import shelve f2 = shelve.open('shelve_file', writeback=True) print(f2['key']) f2['key']['new_value'] = 'this was not here before' f2.close()
import shelve f = shelve.open('shelve_file', flag='r') # f['key']['int'] = 50 # 不能修改已有结构中的值 # f['key']['new'] = 'new' # 不能在已有的结构中添加新的项 f['key'] = 'new' # 但是可以覆盖原来的结构 f.close()
4、hashlib模块
hash 哈希算法 可hash数据类型——>数字的过程
hashlib —— 摘要算法
也是一些算法的集合,有好多算法
字符串 --> 数字
不同的字符串 --> 数字一定不同
无论在哪台机器上,在什么时候计算,对相同的字符串结果总是一样的
摘要过程不可逆
用法
文件的一致性校验
密文验证的时候加密
密文验证的时候加密
md5算法 通用的算法
sha算法 安全系数更高,sha算法有很多种,后面的数字越大安全系数越高,
得到的数字结果越长,计算的时间越长
import hashlib m = hashlib.md5() m.update('alex3714'.encode('utf-8')) print(m.hexdigest()) # 动态加盐 # 500 用户名 和 密码 # 123456 # 111111 d1c59b7f2928f9b1d63898133294ad2c # pwd username username = 'alex' m = hashlib.md5(username[:2:2].encode('utf-8')) m.update('123456'.encode('utf-8')) print(m.hexdigest())