• 23、常用模块二


    一、json与pickle模块

    1.1、什么是序列化和反序列化

      内存中的数据类型====》序列化====》特定的格式(json格式或者pickle格式)

      特定的格式(json格式或者pickle格式)====》反序列化====》内存中的数据类型

      土办法:

     {'aaa':111}--->序列化str({'aaa':111})----->"{'aaa':111}"
      {'aaa':111}<---反序列化eval("{'aaa':111}")<-----"{'aaa':111}"

    1.2、为什么要序列化

      序列化得到的结果====》特定的格式的内容有两种用途

      1.用于存储====》可以存档    

        使用途径 :可以是一种专用的格式,pickle只能在python上识别

      2.传输给其他平台====》用来跨平台数据交互

        使用途径:应该是一种通用的格式,json是一种可以被所有语言识别的格式

    1.3、怎么使用序列化和反序列化

    1.3.1、序列化     json。dumps()

    json_res=json.dumps([1,'aaa',True,False])
    # print(json_res,type(json_res)) # "[1, "aaa", true, false]"

    1.3.2、反序列化    json.loads()

    l=json.loads(json_res)
    print(l,type(l))

    二、configparser   模块

      该模块适用于配置文件的格式与Windows ini文件相似,可以包含一个或者多个标题(section),每个节可以有多个参数(key=value)

    import configparser
    
    config=configparser.ConfigParser()
    config.read('test.ini')      #  test。ini为python文件,里面的格式为节下面包含key=value

    2.1、查看所有标题    config.sectiongs()

    print(config.sections())

    2.2、获取某个section下的所有内容    config.sectiongs(*)以列表形式

    print(config.options('section1'))    #['k1', 'k2', 'user', 'age', 'is_admin', 'salary']

    2.3、获取字典item       config.items()

    print(config.items('section1'))   #[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]

    2.4、获取某个section下面,指定key对应value的值,并且以字符串的形式表示     config.get('section','key')

    #查看标题section1下user的值=>字符串格式
    val=config.get('section1','user')
    print(val) #egon

      2.5、获取某个section下面,指定key对应value的值,并且以数字的形式表示    config.getint('section','key')

    #查看标题section1下age的值=>整数格式
    val1=config.getint('section1','age')
    print(val1) #18

    2.6、获取某个section下面,指定key对应value的值,并且以布尔值的形式表示    config.getboolrean('section','key')

    #查看标题section1下is_admin的值=>布尔值格式
    val2=config.getboolean('section1','is_admin')
    print(val2) #True

    2.7、获取某个section下面,指定key对应value的值,并且以浮点型的形式表示   config.getfloat('section','key')

    #查看标题section1下salary的值=>浮点型格式
    val3=config.getfloat('section1','salary')
    print(val3) #31.0

    三、hashlib模块

    3.1、什么是哈希hash

      hash是是一种算法,该算法接收传入的值的内容,经过运算得到一串的hash值

      hash的特点:

            1.只要传入的值一致,得到的hash值也是一致的

            2.得到的hash值不能返回成原值

            3.不管传入的值有多大,只要hash算法不变,hash长度都是一致的

    3.2、hash的用途

      1.无法返回原值的特性可以作为密码密文的传输与验证

      2.长度以及内用不变性,可以作为文件完整性的检验

    3.3、hash怎么用

      先设定hash的类型,在使用  变量.update(str.encode())进行添加,   最后变量.hexdigest生成hash值

    import hashlib
    m=hashlib.md5()   #md5是hash的类型
    m.update('hello'.encode('utf-8'))   #使用update添加
    m.update('world'.encode('utf-8'))
    res=m.hexdigest() # 'helloworld'      #生成hash值
    print(res)

      只要是同样的内容,最终会生成同样的hash值

    m1=hashlib.md5('he'.encode('utf-8'))
    m1.update('llo'.encode('utf-8'))
    m1.update('w'.encode('utf-8'))
    m1.update('orld'.encode('utf-8'))
    res=m1.hexdigest()# 'helloworld'
    print(res)

    3.4、模拟撞库

      先知道一个hash值,设置一系列的密码,将密码生成hash值,通过对比hash值是否一致,得到密码

    passwds=[
        'alex3714',
        'alex1313',
        'alex94139413',
        'alex123456',
        '123456alex',
        'a123lex',
    ]                       #先设定可能的密码
    
    dic={}              #设置空字典
    for p in passwds:    #循环
        res=hashlib.md5(p.encode('utf-8'))    #将可能的密码转换成hash值
        dic[p]=res.hexdigest()  #    存入字典中
    
    # 模拟撞库得到密码
    for k,v in dic.items():
        if v == cryptograph:     #找到的hash值
            print('撞库成功,明文密码是:%s' %k)
            break    

      提升撞库的难度====》密码加盐

      提高密码的复杂性

    import hashlib
    m=hashlib.md5()
    m.update('天王'.encode('utf-8'))
    m.update('alex3714'.encode('utf-8'))
    m.update('盖地虎'.encode('utf-8'))
    print(m.hexdigest())

    四、subprocess模块

      调用操作系统的命令    subprocess。Popen

    import subprocess
    判断操作系统中是否存在该文件
    obj=subprocess.Popen('echo 123 ; ls / ; ls /root',shell=True,
                     stdout=subprocess.PIPE,    #正确则执行
                     stderr=subprocess.PIPE,    #错误则执行
                     )
    
    print(obj)      #<subprocess.Popen object at 0x00000168D72C0A90>
    res=obj.stdout.read()    
    print(res.decode('utf-8'))    #123 ; ls / ; ls /root
     
    err_res=obj.stderr.read()      #该文件存在,则无输出
    print(err_res.decode('utf-8'))    
  • 相关阅读:
    题解:艾米利亚的魔法
    tarjan求割点
    集合删数
    小测题解
    [考试]20141028
    铺地毯
    [考试]20141027
    大家好
    【DM642学习笔记一】关于Can't Initialize Target CPU的一种解决方法 : Error 0x80000240
    iOS开发之获取系统相册ALAssetLibrary
  • 原文地址:https://www.cnblogs.com/jingpeng/p/12608733.html
Copyright © 2020-2023  润新知