何为模块呢? 其实模块就是.py文件
python之所以好用就是模块多
模块分三种 : 内置模块 、 拓展模块、自定义模块、
现在我们来认识:内置模块中的 序列化模块和 hashlib 模块
1、什么是序列化:将原本的字典 列表等字类的形式转化成字符串的过程就是序列化
2、为什么序列化:
1:以某种存储的形式使自定义对象持久化 #就好比你定义的字典的类型的内容 它可能人输入完就结束了 没有了 我们可以把它转化为字符串类型的 进行存储在文件中或者数据库中
2:将对象从一个地方传递到另一个地方 #网络之间的信号传输你需要进行电信号传输 然后你要把你的传输内容转化为字符串类型的才可以进行传输
3:使程序更具维护性
使用模块就需要把这些定义好的模块导入你的程序内才能使用它的功能 所以就必须使用import进行导入
实例化是创造一个实例,序列化就是创造一个序列的
eg:dic ----->str 这就是序列化的过程
python中的序列化模块:
json:所有的编程语言都通用的序列化格式,也就是你可以把你的内容传递给java 之类的语言 它也是支持的
缺点:它支持的数据类型非常有限,仅仅支持 数字 字符串 列表 字典
pickle:只能在python语言中的程序之间传递数据用
优点;pickle 支持python中的所有的数据类型的使用
shelve :python3X之后才有的
使用序列化模块把内容进行转化的时候把内容存储起来的一定是字符串类型的或者字节
但是进行网络传输一定是字节
对序列化进行操作的需要有四个功能;
dumps ------->把你的内容进行序列化
loads ------>把你的内容进行反序列化
上面两个是直接对内容进行操作 下面是对文件的进行操作
dump -----> 把你要存进文件 内的内容进行序列化
load--------> 把你文件内的内容进行反序列化
json和pickle的读取文件是不同的 因为json读取文件是只能一行存储一个字典的 所以一次只能读取一个
也就是带s的只能对内存中的数据信息操作 不带s的对文件内的存储信息进行操作
只在内存中操作数据 主要用于网络传输 和多个数据与文件打交道
首先你要使用序列化模块你要导入模块
json 内的dumps 和 loads :
import json ?#导入json模块dic ={‘桑塔纳‘:(190,80)}print(dic) ?#看看你所打印出来的信息 ??{‘桑塔纳‘: (190, 80)}print(type(dic)) ?#查看你的字典的具体信息是什么 <class ‘dict‘>ret = json.dumps(dic) ?#把你的字典进行序列化 ?转化为字符串print(ret) #得到 ?{"\u6851\u5854\u7eb3": [190, 80]} ??里面的内容变成两个引号的了print(type(ret)) ?#看看你转化后的信息就是字符串类型了 ?<class ‘str‘># 上面是序列化下面是反序列化 就是你存储后想把这些信息提取出来 查看 或者你传递的信息想要查看 都要进行序列化res = json.loads(ret) ?#把你序列化后的ret进行反序列化print(res) ?#得到{‘桑塔纳‘: [190, 80]}print(type(res)) ???#这个时候你看又回到了dic的类型 进行反序列化后又回到了最初的类型
从上面的显示中可以看出你序列化后的所有的内容都会以双引号的形式显示出来
json内的dump和load
with open(‘序列化‘,‘w‘, encoding = ‘UTF-8‘)as f : ?#因为json只能一次读取一个写入的字典 所以你写入的时候也要一次写入一个 ???json.dump(dic,f,ensure_ascii=False) ?#这是标准语句后面必须加上 ?ensure_ascii = Falsewith open (‘序列化‘, encoding ="UTF-8")as f : ???ret = json.load(f) ?#反序列化 ???print(ret)f = open(‘序列化‘, ‘w‘, encoding = ‘UTF-8‘)json.dump(dic,f,ensure_ascii=False)f.close()f = open(‘序列化‘,encoding =‘UTF-8‘)ret = json.load(f)print(ret)f.close()
你在写入文件的时候不加sure_ascii = False 存进去的就会是乱码的状态 但是你读取出来还是正常的
当你写入多个文件的时候必须要用dump和load 因为你从文件中读取的时候load只能读取一行一行的 所以你存入的时候也要想办法存储的收分行就需要在存入之前进行序列化
你要进行多个序列化然后存储到文件内 必须要转化使用dumps和loads:
import jsondic1= {‘老大‘:(123)}dic2 = {‘老二‘:(345)}dic3 ={‘老三‘:(678)}f = open(‘大表哥‘, ‘w‘, encoding = ‘UTF-8‘)ret1 = json.dumps(dic1,f,ensure_ascii =False)f.write(ret1+‘\n‘)ret2 = json.dumps(dic2,f)f.write(ret2+‘\n‘) ?#不加ensure_ascii = False显示的就是会乱码但是你读取出来不会的 所以你可以选择写或者不写 ensure_ascii = Falseret3 = json.dumps(dic3)f.write(ret3+‘\n‘)f.close()f = open(‘大表哥‘, encoding = ‘UTF-8‘)# ret = json.load(f) ?#这样写实惠报错的 ?因为load不能多行读取只能一行一行读取for line in f : ???print(json.loads(line.strip())) ?#因为你的load只能一行一行读取f.close()
反序列化必须和序列化一起使用 反序列化不能单独使用 json
json如果是对字典序列化的话 这个字典的key必须事str的不能事其他类型
dic = {"190, 90,‘捏脚‘":‘大表哥‘} ?#json 不支持元组 不支持除了str类型以外的keyprint(json.dumps(dic))这就是错的
json除了能对字典操作外 还可以对列表元组操作
dic =[‘999‘,‘www‘]print(json.dumps(dic)) ?#结果["999", "www"]ty = (1111)print(json.dumps(ty)) ?#结果1111
pickle模块:
dumps 和 loads
它的序列化模块不是一个可读的字符串而是一个bytes类型 就是pickle.dumps得到的内容就是bytes类型
其实pickle.dumps loads和json的都差不多只不过pickle的存储是以字节的形式存储的
import pickledic = {(190,90,‘捏脚‘):‘大表哥‘}ret = pickle.dumps(dic)print(ret) ?# ?结果b‘\x80\x03}q\x00K\xbeKZX\x06\x00\x00\x00\xe6\x8d\x8f\xe8\x84\x9aq\x01\x87q\x02X\t\x00\x00\x00\xe5\xa4\xa7\xe8\xa1\xa8\xe5\x93\xa5q\x03s.‘print(pickle.loads(ret))
dump和 load
f = open(‘序列化‘,‘wb‘)pickle.dump(dic,f)f.close()f = open(‘序列化‘, ‘rb‘)print(pickle.load(f))f.close()# 不论是读还是写 都要以+b的形式来进行因为 pickle就是对字节进行操作的
pickle模块多写的:
import pickle dic1 = {‘大表哥‘:(190,70)}dic2 ={(222):333}dic3 = {(123):‘nishou‘}f = open(‘大表哥3‘, ‘wb‘)pickle.dump(dic1,f)pickle.dump(dic2,f)pickle.dump(dic3,f)f.close()f = open(‘大表哥3‘, ‘rb‘) ?#必须以b的形式来读取while True : ???try: ???????print(pickle.load(f)) ???except EOFError: ???????break
json模块和pickle模块两者多行写入的时候对比:
json模块在写入多次dump的时候,不能对应执行多次 load来取出数据,而pickle模块可以一次去除多个数据
json如果要写入多个元素可以先将元素 dumps序列化 ,f.write(序列化, +‘\n‘) 来写入文件
读取文件的时候应该按照逐行读取 再使用loads来把读出来的字符串转化为对应的数据类型
关于序列化自定义类的对象:
class A: ???def __init__(self,name,age): ???????self.name = name ???????self.age = agea = A(‘egon‘, 15)import json# json.dumps(a) ?#报错 不可以对对象进行序列化import pickleret ?= 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‘)# print(pickle.load(f))obj =pickle.load(f)print(obj.__dict__) ?#因为打的是对象只能打的是对象的地址f.close()
shevlve 模块:
是python专有的序列化模块 只针对文件
import shelve ??# python 专有的序列化模块 只针对文件f = shelve.open(‘shelve_file‘) ????# 打开文件f[‘key‘] = {‘int‘:10, ‘float‘:9.5, ‘string‘:‘Sample data‘} ?#直接对文件句柄操作,就可以存入数据f.close()import shelvef1 = shelve.open(‘shelve_file‘)existing = f1[‘key‘] ?#取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错f1.close()print(existing)设置只读方式import shelvef = shelve.open(‘shelve_file‘, flag=‘r‘)existing = f[‘key‘]f.close()print(existing)import shelvef = shelve.open(‘shelve_file‘, flag=‘r‘)# f[‘key‘][‘int‘] = 50 ???# 不能修改已有结构中的值# f[‘key‘][‘new‘] = ‘new‘ # 不能在已有的结构中添加新的项f[‘key‘] = ‘new‘ ????????# 但是可以覆盖原来的结构f.close()#import shelvef1 = shelve.open(‘shelve_file‘)existing = f1[‘key‘] ?#取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错f1.close()print(existing)import shelvef1 = shelve.open(‘shelve_file‘)print(f1[‘key‘])f1[‘key‘][‘new_value‘] = ‘this was not here before‘f1.close()import shelvef1 = shelve.open(‘shelve_file‘)existing = f1[‘key‘] ?#取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错f1.close()print(existing)import shelvef2 = shelve.open(‘shelve_file‘, writeback=True)print(f2[‘key‘])f2[‘key‘][‘new_value‘] = ‘this was not here before‘f2.close()f1 = shelve.open(‘shelve_file‘)existing = f1[‘key‘] ?#取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错f1.close()print(existing)
hash 哈希算法 可hash数据类型——>数字的过程
hashlib模块:
hashlib 摘要算法
也是一些算法的集合,有好多算法
字符串 --> 数字
不同的字符串 --> ?数字一定不同
无论在哪台机器上,在什么时候计算,对相同的字符串结果总是一样的
摘要过程不可逆
先定义一个变量来等于hashlib.md5()
然后再
老师代码:
import hashlib# md5算法 通用的算法# sha算法 安全系数更高,sha算法有很多种,后面的数字越大安全系数越高, ???????# 得到的数字结果越长,计算的时间越长m = hashlib.md5()m.update(‘alex3714‘.encode(‘utf-8‘))print(m.hexdigest())m = hashlib.md5()m.update(‘dazhizi sha‘.encode(‘utf-8‘))print(m.hexdigest())m = hashlib.md5()m.update(‘123456‘.encode(‘utf-8‘))print(m.hexdigest())# 将所有常见的密码 ?md5摘要# 密码 摘要结果# 暴力破解 和 撞库# 加盐m = hashlib.md5(‘wahaha‘.encode(‘utf-8‘))m.update(‘123456‘.encode(‘utf-8‘))print(m.hexdigest()) ????????????????????????????# d1c59b7f2928f9b1d63898133294ad2c# 123456m = hashlib.md5(‘wahaha‘.encode(‘utf-8‘))m.update(‘123456‘.encode(‘utf-8‘))print(m.hexdigest())# 动态加盐# 500 ???用户名 和 密码# 123456# 111111 ??d1c59b7f2928f9b1d63898133294ad2c# pwd usernameusername = ‘alex‘m = hashlib.md5(username[:2:2].encode(‘utf-8‘))m.update(‘123456‘.encode(‘utf-8‘))print(m.hexdigest()) ????????????????????????????# d1c59b7f2928f9b1d63898133294ad2c# 文件的一致性校验 周一讲
面向对象进阶------>模块 ?json ??pickle ?hashlib
原文地址:https://www.cnblogs.com/askzyl/p/8893892.html