zoukankan      html  css  js  c++  java
  • 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:1.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())
    View Code

    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_s2day04')
    
    import tarfile
    t=tarfile.open('data_bak.tar.gz','r')
    t.extractall('D:SH_fullstack_s2day20dir')
    t.close()
    View Code


    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()
    View Code

    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')
    View Code

    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))
    View Code

    面向对象 重点

    面向过程编程
        核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么然后干什么。。。
        基于该思想编写程序好比在设计一条流水线,是一种机械式的思维方式
    
        优点:复杂的问题流程化、进而简单化
        缺点:扩展性差
    
    面向对象编程
        核心对象二字,对象是特征与技能的结合体
        基于该思想编写程序就好比是在创造一个世界,你就是这个世界的上帝,是一种上帝式的思维方式
    
        优点:可扩展性强
        缺点:编程的复杂度要高于面向过程
    
    
    '''
    类:种类、分类、类别
        对象是特征与技能的结合体,类是一系列对象相似的特征与技能的结合体
        强调:站的角度不同,总结出的类是截然不同的
    
        在现实世界中:先有的一个个具体存在的对象,然后随着人类文明的发展才了分类的概念
        在程序中:必须先定义类,后调用类来产生对象
    
    站在老男孩选课系统的角度,先总结现实世界中的老男孩的学生对象
        对象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() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例
    
    # 类的实例化过程都发生了哪些事?
    # 如何在实例化的过程中为对象定制自己独有的特征
    # 程序中对象到底是什么,如何使用?
    View Code
    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:PycharmProjectsoldboy-py-learn-s2作业day20xjj.json'))
    View Code
  • 相关阅读:
    POJ 2636:Electrical Outlets
    POJ 2260:Error Correction
    POJ 2080:Calendar
    POJ 2017:Speed Limit
    POJ 1504:Adding Reversed Numbers
    POJ 1477:Box of Bricks
    POJ 1060:Modular multiplication of polynomials
    HDU 1379:DNA Sorting
    HDU 1009:FatMouse' Trade
    mysql修改初始密码
  • 原文地址:https://www.cnblogs.com/xujinjin18/p/9226025.html
Copyright © 2011-2022 走看看