• day 25 序列化模块( json + pickle + shelve) + hashlib模块


    模块:

      1.py文件就是模块,

      2.python之所以好用,就是因为模块多

    模块分为三种:

      内置模块  python安装时自带的

      扩展模块  itchat                         # 别人写好的 需要安装之后可以直接使用

                beautiful soap
    selenium 网页自动化测试工具
    django tornado
      自定义模块: 自己写的模块

    序列化模块:
      1.能储存在文件中的一定是字符串或者字节
      2.能在网络上传输的 只有 字节

    # dic = {"大表哥":(190,90)}
    # dic --> 字符串 # 序列化
    # 字符串 --> dic # 反序列化
    # 序列化 == 创造一个序列 ==》创造一个字符串
    # 实例化 == 创造一个实例

    # python中的序列化模块
    # json 所有的编程语言都通用的序列化格式
    # 它支持的数据类型非常有限 数字 字符串 列表 字典
    # pickle 只能在python语言的程序之间传递数据用的
    # pickle支持python中所有的数据类型
    # shelve python3.* 之后才有的
    import json
    # dic = {"大表哥":(190,90,'捏脚')}
    # 序列化
    # ret = json.dumps(dic,ensure_ascii=False)
    # print(type(dic),dic)
    # print(type(ret),ret)
    # 反序列化
    # 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+'
    ')
    # str2 = json.dumps(dic2)
    # f.write(str2+'
    ')
    # str3 = json.dumps(dic3)
    # f.write(str3+'
    ')
    # f.close()
    
    # f = open('大表哥','r',encoding='utf-8')
    # for line in f:
    #     print(json.loads(line.strip()))
    # f.close()
    # 参数
    
    # import json
    # dic = {(190,90,'捏脚'):"大表哥"}    # json不支持元组 不支持除了str数据类型之外的key
    # print(json.dumps(dic))

     # json不支持元组 不支持除了str数据类型之外的key,所以上面的运行会报错


    # dumps序列化 loads反序列化  只在内存中操作数据 主要用于网络传输 和多个数据与文件打交道
    # dump序列化  load反序列化   主要用于一个数据直接存在文件里—— 直接和文件打交道

    
    

    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

    # json 在写入多次dump的时候 不能对应执行多次load来取出数据,pickle可以
    # json 如果要写入多个元素 可以先将元素dumps序列化,f.write(序列化+' ')写入文件
    # 读出元素的时候,应该先按行读文件,在使用loads将读出来的字符串转换成对应的数据类型

    # 关于序列化自定义类的对象
    # 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__)
     

    import 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
    # f = shelve.open('shelve_file', flag='r')
    # # f['key']['int'] = 50 # 不能修改已有结构中的值
    # # f['key']['new'] = 'new' # 不能在已有的结构中添加新的项
    # f['key'] = 'new' # 但是可以覆盖原来的结构
    # f.close()
    # #
    # import shelve
    # f1 = shelve.open('shelve_file')
    # existing = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
    # f1.close()
    # print(existing)

    # import shelve
    # f1 = shelve.open('shelve_file')
    # print(f1['key'])
    # f1['key']['new_value'] = 'this was not here before'
    # f1.close()

    # import shelve
    # f1 = shelve.open('shelve_file')
    # existing = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
    # f1.close()
    # print(existing)



    shelve 回写,可改模式:(找到指定的键即可修改它的值)
    条件:
    
    

    # import shelve
    # f2 = shelve.open('shelve_file', writeback=True)
    # print(f2['key'])
    # f2['key']['new_value'] = 'this was not here before'
    # f2.close()



    hashlib 模块
     hash      哈希算法 可hash数据类型——>数字的过程

    # hashlib —— 摘要算法
    # 也是一些算法的集合,有好多算法
    # 字符串 --> 数字
    # 不同的字符串 --> 数字一定不同
    # 无论在哪台机器上,在什么时候计算,对相同的字符串结果总是一样的
    # 摘要过程不可逆

    # 用法
    # 文件的一致性校验
    # 密文验证的时候加密

    # 密文验证的时候加密
    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

    # 123456
    m = hashlib.md5('wahaha'.encode('utf-8'))
    m.update('123456'.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()) # d1c59b7f2928f9b1d63898133294ad2c


    she方法:

    MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

    import hashlib
     
    sha1 = hashlib.sha1()
    sha1.update('how to use sha1 in ')
    sha1.update('python hashlib?')
    print sha1.hexdigest()

    SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。

    #文件的一致性校验
    #文件的一致性校验
    # import hashlib
    # def check(filename):
    #     m = hashlib.md5()
    #     with open(filename,'rb') as f:
    #         content = f.read()
    #     m.update(content)
    #     return m.hexdigest()
    # ret1 = check('file1')
    # ret2 = check('file2')
    # print(ret1)
    # print(ret2)
    
    #一段字符串直接进行摘要和分成几段进行摘要是一样的
    import hashlib
    def check():
        m = hashlib.md5()
        m.update(b'hello alex,')
        m.update(b'I konow you pwd is alex sb 3712') #52cb57a3ff4289c8109a18e18610c3dc
        print(m.hexdigest())
    
    check()


    #一段字符串直接进行摘要和分成几段进行摘要是一样的
     
    import hashlib
    def check():
        m = hashlib.md5()
        m.update(b'hello alex,')
        m.update(b'I konow you pwd is alex sb 3712') #52cb57a3ff4289c8109a18e18610c3dc
        print(m.hexdigest())
    
    check()
    
    
    
    
    
     
  • 相关阅读:
    手把手教你进行R语言的安装及安装过程中相关问题解决方案
    一篇文章助你理解Python3中字符串编码问题
    一篇文章助你理解Python2中字符串编码问题
    浅谈unicode编码和utf-8编码的关系
    网络爬虫过程中5种网页去重方法简要介绍
    手把手教你如何安装水晶易表——靠谱的安装教程
    在Windows上如何安装和彻底卸载Adobe Flash Player教程
    java 类的执行顺序
    bean的二次加工-Spring5.X后置处理器BeanPostProcessor
    Spring里面bean的生命周期里面的init和destroy方法
  • 原文地址:https://www.cnblogs.com/zsdbk/p/8893611.html
Copyright © 2020-2023  润新知