python-study-20
hashlib 重点
文件一致性校验
明文密码(加盐)加密
''' 1 什么是hash hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值 如果把hash算法比喻为一座工厂 那传给hash算法的内容就是原材料 生成的hash值就是生产出的产品 2、为何要用hash算法 hash值/产品有三大特性: 1、只要传入的内容一样,得到的hash值必然一样 2、只要我们使用的hash算法固定,无论传入的内容有多大, 得到的hash值的长度是固定的 3、不可以用hash值逆推出原来的内容 基于1和2可以在下载文件时做文件一致性校验 基于1和3可以对密码进行加密 3、如何用 ''' import hashlib # #1、造出hash工厂 # m=hashlib.md5() # # #2、运送原材料 # m.update('你好啊美丽的'.encode('utf-8')) # m.update('张铭言'.encode('utf-8')) # # #3、产出hash值 # print(m.hexdigest()) #66bcb9758826f562ae8cb70d277a4be9 # #1、造出hash工厂 # m=hashlib.md5('你'.encode('utf-8')) # # #2、运送原材料 # m.update('好啊美丽的张铭言'.encode('utf-8')) # # #3、产出hash值 # print(m.hexdigest()) #66bcb9758826f562ae8cb70d277a4be9 # 应用一:文件一致性校验 # #1、造出hash工厂 # m=hashlib.sha512('你'.encode('utf-8')) # # #2、运送原材料 # m.update('好啊美sadfsadf丽asdfsafdasdasdfsafsdafasdfasdfsadfsadfsadfsadfasdff的张铭言'.encode('utf-8')) # # # #3、产出hash值 # print(m.hexdigest()) #2ff39b418bfc084c8f9a237d11b9da6d5c6c0fb6bebcde2ba43a433dc823966c # #1、造出hash工厂 # m=hashlib.md5() # # #2、运送原材料 # with open(r'E:\01.mp4','rb') as f: # for line in f: # m.update(line) # #3、产出hash值 # print(m.hexdigest()) #1273d366d2fe2dc57645cc1031414a05 # # 1273d366d2fe2dc57645cc1031414a05 # 应用一:对明文密码进行加密 # password=input('>>>: ') # # m=hashlib.md5() # m.update('天王盖地虎'.encode('utf-8')) # m.update(password.encode('utf-8')) # print(m.hexdigest()) #95bd6eafefdf51d8b153785f3fb6263d # # import hmac # # m=hmac.new('小鸡炖蘑菇'.encode('utf-8')) # m.update('hello'.encode('utf-8')) # print(m.hexdigest())
shutil 了解
文件cp 删除 移动 压缩打包
import shutil # with open('old.xml','r') as read_f,open('new.xml', 'w') as write_f: # shutil.copyfileobj(read_f,write_f) # # shutil.make_archive("data_bak", 'gztar', root_dir='D:\SH_fullstack_s2\day04') import tarfile t=tarfile.open('data_bak.tar.gz','r') t.extractall('D:\SH_fullstack_s2\day20\dir') t.close()
shevle 读写字典文件 了解
import shelve # dic1={'pwd':'alex3714','age':18,'sex':'male'} # dic2={'pwd':'alex3715','age':73,'sex':'male'} d=shelve.open('db.txt',writeback=True) # # d['egon']=dic1 # # d['alex']=dic2 # d['egon']['age']=19 print(d['egon']) d.close()
xml 被json替代了 了解
import xml.etree.ElementTree as ET tree = ET.parse("a.xml") root = tree.getroot() # 对于任何标签都有三个特征:标签名、标签属性、标签的文本内容 # print(root.tag) # print(root.attrib) # print(root.text) # print(list(root.iter('year'))) #全文搜索,找到所有 # for year in root.iter('year'): # print(year.tag) # print(year.attrib) # print(year.text) # print('='*100) # print(root.find('country').attrib) #在root的子节点找,只找一个 # print([country.attrib for country in root.findall('country')]) #在root的子节点找,找所有 # 1、查 #遍历整个文档 # for country in root: # print('============>国家 %s' %country.attrib) # for item in country: # print(item.tag) # print(item.attrib) # print(item.text) #2、改 # for year in root.iter('year'): # print(year.tag) # year.attrib={'updated':'yes'} # year.text=str(int(year.text)+1) # # tree.write('a.xml') #3、增 # for country in root: # rank=country.find('rank') # if int(rank.text) > 50: # # print('符号条的国家',country.attrib) # tag=ET.Element('egon') # tag.attrib={'updated':'yes'} # tag.text='NB' # country.append(tag) # # tree.write('a.xml') #4、删 for country in root: tag=country.find('egon') # print(tag,bool(tag)) if tag is not None: print('====>') country.remove(tag) tree.write('a.xml')
configparser 操作一种特殊的文件格式
import configparser config=configparser.ConfigParser() config.read('config.ini') #a.cfg a.ini a.cnf # print(config.sections()) # print(config.options('egon')) # print(config.items('egon')) # res=config.get('egon','age') # res=config.getint('egon','age') # print(res,type(res)) # res=config.getfloat('egon','salary') # print(res,type(res)) # res=config.getboolean('egon','is_beautiful') # print(res,type(res))
面向对象 重点
面向过程编程 核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么然后干什么。。。 基于该思想编写程序好比在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题流程化、进而简单化 缺点:扩展性差 面向对象编程 核心对象二字,对象是特征与技能的结合体 基于该思想编写程序就好比是在创造一个世界,你就是这个世界的上帝,是一种上帝式的思维方式 优点:可扩展性强 缺点:编程的复杂度要高于面向过程 ''' 类:种类、分类、类别 对象是特征与技能的结合体,类是一系列对象相似的特征与技能的结合体 强调:站的角度不同,总结出的类是截然不同的 在现实世界中:先有的一个个具体存在的对象,然后随着人类文明的发展才了分类的概念 在程序中:必须先定义类,后调用类来产生对象 站在老男孩选课系统的角度,先总结现实世界中的老男孩的学生对象 对象1: 特征: 学校='oldboy' 姓名='耗哥' 年龄=18 性别='male' 技能: 选课 对象2: 特征: 学校='oldboy' 姓名='猪哥' 年龄=17 性别='male' 技能: 选课 对象3: 特征: 学校='oldboy' 姓名='帅翔' 年龄=19 性别='female' 技能: 选课 站在老男孩选课系统的角度,先总结现实世界中的老男孩学生类 老男孩学生类: 相似的特征: 学校='oldboy' 相似的技能 选课 ''' #在程序中 #1、先定义类 class OldboyStudent: school='oldboy' def choose_course(self): print('is choosing course') #类体代码会在类定义阶段就立刻执行,会产生一个类的名称空间 # 类的本身其实就是一个容器/名称空间,是用来存放名字的,这是类的用途之一 # print(OldboyStudent.__dict__) # print(OldboyStudent.__dict__['school']) # print(OldboyStudent.__dict__['choose_course']) # OldboyStudent.__dict__['choose_course']() # print(OldboyStudent.school) #OldboyStudent.__dict__['school'] # print(OldboyStudent.choose_course) #OldboyStudent.__dict__['choose_course'] # OldboyStudent.choose_course(111) # OldboyStudent.country='China' #OldboyStudent.__dict__['country']='China' # OldboyStudent.country='CHINA' #OldboyStudent.__dict__['country']='China' # del OldboyStudent.school # print(OldboyStudent.__dict__) #2、后调用类产生对象,调用类的过程,又称为类的实例化,实例化的结果称为类的对象/实例 stu1=OldboyStudent() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例 stu2=OldboyStudent() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例 stu3=OldboyStudent() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例 # 类的实例化过程都发生了哪些事? # 如何在实例化的过程中为对象定制自己独有的特征 # 程序中对象到底是什么,如何使用?
4月10号作业 1、编写用户认证功能,要求如下 1.1、对用户密码加盐处理 1.2、用户名与密文密码存成字典,是以json格式存到文件中的 1.3、要求密用户输入明文密码,但程序中验证的是密文 2、编写功能,传入文件路径,然后取文件10% 30% 50% 80%四个位置读取10字节的数据,更新到hash工厂里,算出文件的hash值 3、预习对象相关知识,完成下述作业: 如果我让你编写一个选课系统,那么有如下对象,请抽象成类,然后在程序中定义出来 4.1 老男孩有两所学校:北京校区和上海校区 4.2 老男孩学校有两们课程:python和linux 4.3 老男孩有老师:egon,alex,lxx,wxx,yxx 4.3 老男孩有学生:。。。 4.4 老男孩有班级:python全栈开发1班,linux高级架构师2班
##1 import hashlib import os import json def auth_hash(pwd): m = hashlib.md5('salt'.encode('utf-8')) m.update(pwd.encode('utf-8')) m.hexdigest() return m.hexdigest() def save(name,new_pwd): user_dic = {'name': name, 'hash_pwd': new_pwd} BASE_DIR = os.path.dirname(os.path.abspath(__file__)) user_path = os.path.join(BASE_DIR, '%s.json' % name) with open(user_path, 'w', encoding='utf-8') as f: json.dump(user_dic, f) f.flush() def login_auth(name,new_pwd): # user_dic = {'name': name, 'hash_pwd': new_pwd} BASE_DIR = os.path.dirname(os.path.abspath(__file__)) user_path = os.path.join(BASE_DIR, '%s.json' % name) with open(user_path,encoding='utf-8') as f: user_dic = json.load(f) if name == user_dic['name'] and new_pwd == user_dic['hash_pwd']: return True,'登录成功' else: return False,'用户名或密码错误' name = input('username>>: ').strip() pwd = input('password>>: ').strip() new_pwd = auth_hash(pwd) # save(name,new_pwd) flag,msg = login_auth(name,new_pwd) if flag: print(msg) else: print(msg) ##2 def file_hash(path): import hashlib m = hashlib.md5() with open(path,'rb') as f: for line in f: m.update(line) res = m.hexdigest() return res print(file_hash(r'F:\PycharmProjects\oldboy-py-learn-s2\作业\day20\xjj.json'))