• Day25


    1、json模块

    三种
    内置模块 python安装的时候自带的
    扩展模块 itchat # 别人写好的 需要安装之后可以直接使用
    beautiful soap
    selenium 网页自动化测试工具
    django tornado
    自定义模块 自己写的模块

    内置模块
    序列化模块
    hashlib模块

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

    dic --> 字符串 # 序列化
    字符串 --> dic # 反序列化
    序列化 == 创造一个序列 ==》创造一个字符串
    实例化 == 创造一个实例

    python中的序列化模块
      json 所有的编程语言都通用的序列化格式
      它支持的数据类型非常有限 数字 字符串 列表 字典
      pickle 只能在python语言的程序之间传递数据用的
      pickle支持python中所有的数据类型
      shelve python3.* 之后才有的

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

    json不支持元组 不支持除了str数据类型之外的key

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

    import json
    dic = {"大表哥":(190,90,'捏脚')}
    序列化
    ret = json.dumps(dic,ensure_ascii=False)
    print(type(dic),dic)
    print(type(ret),ret)
    print('*',str(dic))   # 土办法
    反序列化
    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)
    View Code
    data = {'username':['李华','二愣子'],'sex':'male','age':16}
    json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)
    print(json_dic2)
    View Code
    # 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()
    View Code

    2、pickle模块

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

    3、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)
    View Code
    #设置只读方式
    import shelve
    f = shelve.open('shelve_file', flag='r')
    existing = f['key']
    f.close()
    print(existing)
    View Code
    import shelve
    f2 = shelve.open('shelve_file', writeback=True)
    print(f2['key'])
    f2['key']['new_value'] = 'this was not here before'
    f2.close()
    View Code
    import shelve
    f = shelve.open('shelve_file', flag='r')
    # f['key']['int'] = 50    # 不能修改已有结构中的值
    # f['key']['new'] = 'new' # 不能在已有的结构中添加新的项
    f['key'] = 'new'         # 但是可以覆盖原来的结构
    f.close()
    View Code

    4、hashlib模块

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

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

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

    密文验证的时候加密

    md5算法 通用的算法
    sha算法 安全系数更高,sha算法有很多种,后面的数字越大安全系数越高,
    得到的数字结果越长,计算的时间越长

    import hashlib
    m = hashlib.md5()
    m.update('alex3714'.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())  
    View Code
  • 相关阅读:
    能用HTML/CSS解决的问题,就不要用JS
    跨域
    从输入url到页面展示到底发生了什么
    hosts 文件
    了解Web及网络基础
    hybrid
    组件化和 React
    MVVM 和 VUE
    虚拟 DOM
    ES6模块化与常用功能
  • 原文地址:https://www.cnblogs.com/a352735549/p/8892326.html
Copyright © 2020-2023  润新知