zoukankan      html  css  js  c++  java
  • python学习之模块-模块(二)

    5.2 序列化模块

    ​ 将一种数据结构转换成一种特殊的序列(字符串或bytes)的过程就叫序列化。这个特殊的序列还可以通过命令反解回原来的数据类型。

    python中有三种序列化的功能模块:

    json模块:

    ​ 不同语言间遵循的一种数据转化格式,序列化为不同语言都能使用的特殊字符串;json只支持部分python数据结构(int,str,bool,tuple,float,dict)

    ​ 使用最多

    pickle模块:

    ​ python独有的一种数据转化格式,支持python所有的数据类型包括实例化对象。

    shelve模块:

    ​ 类似于操作字典的方式操作特殊的字符串

    5.2.1 json模块

    json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去

    ​ 序列化模块总共只有两种用法,要不就是用于网络传输的中间环节,要不就是文件存储的中间环节,所以json模块总共就有两对四个方法:

    用于网络传输:dumps、loads

    用于文件写读:dump、load

    dumps、loads
    import json  #加载json模块
    ret = {2:'哈哈',1:'你好'}
    ret_dm = json.dumps(ret,sort_keys=True)   #使用dumps进行格式转换,sort_keys=True是指使用key排序
    print(ret_dm)   #输出{"1": "u4f60u597d", "2": "u54c8u54c8"}
    ret_lo = json.loads(ret_dm)     #转换回来
    print(ret_lo)   #输出{'1': '你好', '2': '哈哈'}
    

    【注意】

    • json转换完的字符串类型的字典中的字符串是由""表示的;
    • 要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
    # 配合文件使用
    import json
    ret = {2:'你好',1:'哈哈'}
    ret_dm = json.dumps(ret,sort_keys=True)
    with open('dum.json',mode='w',encoding='utf-8') as f:
        f.write(ret_dm)
    with open('dum.json',mode='r',encoding='utf-8') as f1:
        s = f1.read()
        ret_lo = json.loads(s)
        print(ret_lo)
    
    dump、load
    import json
    dic = {2:'你好',1:'哈哈'}
    with open('dum.json',mode='w',encoding='utf-8') as f:
        json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
    with open('dum.json',mode='r',encoding='utf-8') as f1:
       print(json.load(f1))  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
    

    【说明】

    • ensure_ascii:当它为True的时候,所有非ASCII码字符显示为uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。
    • separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’)这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。
    • sort_keys:将数据根据keys的值进行排序。
    序列化存储多个数据

    【原则】:一个json文件只能存储一个json数据

    dic1 = {'name':'盖伦'}
    dic2 = {'name':'皇子'}
    dic3 = {'name':'赵信'}
    with open('序列化',encoding='utf-8',mode='a') as f1:
        str1 = json.dumps(dic1)
        f1.write(str1+'
    ')
        str2 = json.dumps(dic2)
        f1.write(str2+'
    ')
        str3 = json.dumps(dic3)
        f1.write(str3+'
    ')
    

    5.2.2 pickle模块

    pickle模块是将Python所有的数据结构以及对象等转化成bytes类型,然后还可以反序列化还原回去。

    pickle模块是只能Python语言识别的序列化模块

    用于网络传输:dumps、loads

    用于文件写读:dump、load

    dumps、loads
    import pickle
    
    dic = {2:'你好',1:'哈哈'}
    st = pickle.dumps(dic)
    print(st)   #输出b'x80x03}qx00(Kx02Xx06x00x00x00xe4xbdxa0xe5xa5xbdqx01Kx01Xx06x00x00x00xe5x93x88xe5x93x88qx02u.'
    dic1 = pickle.loads(st)
    print(dic1)
    
    dump、load
    import pickle
    
    dic = {(1,2):'序列化',1:True,'set':{1,2,3}}
    with open('序列化',mode='wb') as f :
        pickle.dump(dic,f)
    with open('序列化',mode='rb') as f1:
        dic1 = pickle.load(f1)
        print(dic1)
    
    序列化存储多个数据

    dump也是一个一个文件的写入

    import pickle
    
    dic1 = {'name':'盖伦'}
    dic2 = {'name':'皇子'}
    dic3 = {'name':'赵信'}
    with open('序列胡',mode='wb') as f:
        pickle.dump(dic1,f)
        pickle.dump(dic2,f)
        pickle.dump(dic3,f)
        f.close()
    with open('序列化',mode='rb') as f1:
        while True:
            try:
                print(pickle.load(f1))
            except EOFError:
                break
    

    5.3 OS模块

    ​ os模块是与操作系统交互的一个接口,它提供的功能多与工作目录,路径,文件等相关操作。

    当前目录 = 工作目录 = 父级目录:指的是当前文件所在的文件夹

    与工作目录有关
    import os
    
    print(os.getcwd())  # 获取当前工作目录的 绝对路径  ***
    os.chdir(r'D:s23day9')   #改变当前工作的工作目录
    print(os.getcwd())  
    print(os.curdir)	#返回当前目录
    print(os.pardir)	#返回当前目录的父目录
    
    与文件夹相关
    import os
    os.makedirs(r'112233')   #创建多层目录
    os.removedirs('11/22/33')   #若目录为空,则删除目录,并递归到上一级目录,继续判断汉朝
    os.mkdir('11')  #生成单极目录
    os.rmdir('11')  #删除单机目录
    
    与文件相关
    os.remove()	#删除一个文件***
    os.rename(oldname,newname)	#重命名一个文件***
    os.stat('path/filename')  获取文件/目录信息 
    print(__file__)   #动态获取当前文件的绝对路径******
    
    与操作系统相关
    print(os.environ)   #获取系统的环境变量  ***
    os.sep    输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" *
    os.linesep    输出当前平台使用的行终止符,win下为"	
    ",Linux下为"
    " *
    os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为: *
    os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix' *
    和执行系统命令相关
    os.system("bash command")  运行shell命令,直接显示  **
    os.popen("bash command).read()  运行shell命令,获取执行结果  **
    
    与路径相关path系列
    os.path.abspath(path) 返回path规范化的绝对路径  ***
    os.path.split(path) 将path分割成目录和文件名二元组返回 ***
    os.path.dirname(path) 返回path的父级目录。其实就是os.path.split(path)的第一个元素  **
    print(__file__)   #动态获取当前文件的绝对路径******
    os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值,即os.path.split(path)的第二个元素。 **
    os.path.exists(path)  如果pat文件夹存在,返回True;如果path不存在,返回False  ***
    os.path.isabs(path)  如果path是绝对路径,返回True  **
    os.path.isfile(path)  如果path是一个文件路径,返回True。否则返回False  ***
    os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False  ***
    os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 ***
    os.path.getatime(path)  返回path所指向的文件或者目录的最后访问时间  **
    os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间  **
    os.path.getsize(path) 返回path的大小 ***
    

    5.4 sys模块

    sys模块是与python解释器交互的一个接口

    sys.argv           命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        退出程序,正常退出时exit(0),错误退出sys.exit(1)
    sys.version        获取Python解释程序的版本信息
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值  ***
    sys.platform       返回操作系统平台名称
    exit  #强制退出
    quit
    

    5.5 hashlib模块

    加密模块,是多个加密算法的集合。

    hashlib加密:
    1. 将一个bytes类型的数据 通过hashlib进行加密返回 一个等长度的16进制数字.
    2. 过程不可逆.
    3. 相同的bytes类型的数据通过相同的加密方法得到的数字绝对相同.
    4. 不相同的bytes类型的数据通过相同的加密方法得到的数字绝对不相同.

    5.5.1 密码加密

    MD5加密
    import hashlib
    
    ret = hashlib.md5()   #步骤一
    ret.update('12345'.encode('utf-8'))   #步骤二
    s = ret.hexdigest()   #步骤三
    print(s)
    
    撞库
    # 撞库,
    ret = hashlib.md5()
    ret.update('123456*@qwe'.encode('utf-8'))
    s = ret.hexdigest()
    print(s,type(s))
    
    固定加盐

    给普通的MD5加密加一道工序

    ret = hashlib.md5('德玛西亚'.encode('utf-8'))  # 德玛西亚  就是固定的盐
    ret.update('a'.encode('utf-8'))
    print(ret.hexdigest())
    
    动态加盐
    username = '德玛西亚'
    ret = hashlib.md5(username[::2].encode('utf-8'))  # 针对于每个账户,每个账户的盐都不一样
    ret.update('a'.encode('utf-8'))
    print(ret.hexdigest())
    

    5.5.2 文件校验

    分段update
    import hashlib
    s1 = '盖伦 是德玛西亚 最 忠诚的 战士'
    
    # 1
    ret = hashlib.md5()
    ret.update(s1.encode('utf-8'))
    print(ret.hexdigest())
    
    
    # 2
    ret = hashlib.md5()
    ret.update('盖伦'.encode('utf-8'))
    ret.update(' 是德玛西亚'.encode('utf-8'))  #字符串里有空格,一定要加上空格
    ret.update(' 最'.encode('utf-8'))
    ret.update(' 忠诚的'.encode('utf-8'))
    ret.update(' 战士'.encode('utf-8'))
    print(ret.hexdigest())  
    
    高阶版文件校验
    # 基础版,小文件可以这样加密
    import hashlib
    ret = hashlib.md5()
    with open('MD5文件校验',mode='rb') as f1:
        content = f1.read()
        ret.update(content)
    print(ret.hexdigest())
    
    #高阶版,不占用很多的内存
    ret = hashlib.md5()
    with open('python-3.7.4rc1-embed-win32.zip',mode='rb') as f1:
        while 1 :
            s = f1.read(1024)
            if s:
                ret.update(s)
            else:
                break
        x = ret.hexdigest()
    print(x)
    
    仅供参考,欢迎指正
  • 相关阅读:
    双边沿采样
    `ifdef、`else、`endif 用法
    交通信号灯
    异步复位同步释放
    用Verilog来实现d触发器2分频的Verilog hdl程序
    谈谈Mux与门电路的相互替换(包含实例分析)
    数字电路笔试题
    仰视奶牛
    单调栈
    div2 620 C
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11099563.html
Copyright © 2011-2022 走看看