• python之序列化、OS、SYS、hashlib模块


    一、序列化模块

    1.序列化模块的用途

    将一种数据结构转换成特殊的序列(特殊字符串,bytes),并且还可以转换回去

    凡是数据通过网络传出去最终的格式必须bytes

    2.json模块

    json 是一种轻量级的数据交换格式

    用途: 所有编程语言公认的一种序列

    缺点: 支持的python的数据结构有限,只支持: int str bool dict list tuple None 除了(set())和对象

    用法一 (两对儿,四个方法)
    dumps,loads # 用于网络传输 #原则一对一,一个dumps对应一个loads
    
    # 转换传输
    dic = {'username':'太白'}
    ret = json.dumps(dic,ensure_ascill=False,sort_keys=True)
    print(ret)
    
    # 反转回来
    ret_dict = json.loads(ret)
    print(ret_dict)
    
    将转换后的特殊字符串写入文件,再从文件中读取出来,再反转回来
    import json
    dic = {'username': '太白', 'password': 123,'status': False}
    
    with open('register.json',mode='w',encoding='utf-8') as f1:
    	ret = json.dumps(dic, ensure_ascii=False)
    	f1.write(ret+'
    ')
    with open('register.json',mode='r',encoding='utf-8') as f2:
    	for line in f2:
    		ret_dic = json.loads(line)
    		print(ret_dic)
    
    # 该题练习主题是: 先将转换写入文件,再从文件中读取出来,反转回来
    # register.json内容
    {"username": "太白", "password": 123, "status": false}
    # 输出结果
    {'username': '太白', 'password': 123, 'status': False}
    
    用法二
    dump,load # 用于单个数据的存取文件,只能用于单个字典,用法很狭窄
    import json
    dic = {'username': '太白', 'password': 123,'status': False}
    with open('jsonlx1.json',encoding='utf-8',mode='w') as f1:
        json.dump(dic,f1)
    
    
    with open('jsonlx1.json',encoding='utf-8') as f1:
        dic1 = json.load(f1)
    
    print(dic1,type(dic1))
    
    将多个数据存储到一个文件中
    l1 = ['wusir', '太白', '小黑1', 666]
    l2 = ['wusir', '太白', '小黑2', 666]
    l3 = ['wusir', '太白', '小黑3', 666]
    with open('pickle练习1.pickle',mode='wb') as f1:
        pickle.dump(l1,f1)
        pickle.dump(l2,f1)
        pickle.dump(l3,f1)
    
    with open('pickle练习1.pickle', mode='rb') as f1:
        ret1 = pickle.load(f1)
        ret2 = pickle.load(f1)
        ret3 = pickle.load(f1)
        print(ret1,ret2,ret3)
    
    

    3. pickle模块

    用途: 支持python的所有类型和数据对象

    缺点: 只能python使用

    用法一 (两对儿,四个方法)
    dumps,loads # 只能是网络传输用,直接转换成bytes
    
    # 转换传输
    l1 = ['wusir', '太白', '小黑', 666]
    ret = pickle.dumps(l1)
    print(ret)
    
    # 反转回来
    l2 = pickle.loads(ret)
    print(l2)
    
    
    用法二
    dump,load # 用于单个数据的存取文件,只能用于单个字典,用法很狭窄
    l1 = ['wusir', '太白', '小黑', 666]
    with open('a.pickle',mode='wb') as f1:
    	pickle.dump(l1,f1)
    

    shevle模块(不讲)

    用途: 只能是文件存取,shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些

    用法

    import shelve
    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)
    

    二、sys模块

    用法

    import sys
    
    sys.path ***
    
    sys.version
    
    sys.argv
    
    for i in range(3)
    	print(i)
    sys.exit(n) # 强制退出
    
    

    三、OS模块

    用法

    import os
    print(os.getcwd()) # 获取当前的绝对路径
    os.chdir(r'/Users/wuqiang/work/PycharmProjects/python23') # 切换目录 相对于shell下cd
    print(os.curdir) # 返回当前路径
    
    # 和文件相关
    os.makedirs('目录1/目录2')
    os.makedirs('dirname1/dirname2/dirname4') #创建多级目录
    os.removedirs('dirname1/dirname2/dirname4') #递归删除多级目录
    os.mkdir('abc') #创建单级目录
    os.rmdir('abc') #删除单级目录
    print(os.listdir('/Users/wuqiang/work/PycharmProjects/python23')) #查看目录下文件类似ls
    print(os.stat('/Users/wuqiang/work/PycharmProjects/python23')) #获取状态,文件信息
    print(os.environ) #获取环境变量
    
    # 路径相关
    print(os.path.abspath('day17.py')) # 获取绝对路径
    print(os.path.split(os.path.abspath('day17.py'))) #将文件路径和文件名分割
    print(os.paty.dirnaem('day17.py'))
    print(__file__) #动态获取当前文件的绝对路径
    print(os.path.dirname(os.path.dirname(__file__))) #获取爷爷级目录
    print(os.path.basename('day17.py')) #获取文件名
    print(os.path.exists('day17.py')) # 判断文件是否存在
    print(os.path.isabs('/Users/wuqiang/work/PycharmProjects/python23/day17')) #判断是不是绝对路径
    print(os.path.isfile('/Users/wuqiang/work/PycharmProjects/python23/day17')) #判断是不是存在的文件
    print(os.path.isdir('day17.py')) #判断是否是一个目录
    print(os.path.exists('day17.py')) #判断这个路径或文件是否存在
    print(os.path.join('/Users/wuqiang/work/PycharmProjects/python23/day17','day17.py'))#将路径和文件拼接在一起
    print(os.path.getatime('/Users/wuqiang/work/PycharmProjects/python23/day17'))#最后访问时间
    print(os.path.getmtime('/Users/wuqiang/work/PycharmProjects/python23/day17'))#最后修改时间
    print(os.path.getsize('/Users/wuqiang/work/PycharmProjects/python23/day17')) #文件的大小
    
    

    文件的拼接

    print(os.path.join('/user/local/','filename.txt'))
    
    # 输出结果
    /user/local/filename.txt
    

    四、hashlib (加密)

    用途: 加密模块,摘要算法,散列算法,它是一堆加密算法的集合

    • 密码加密
    • 文件的一致性校验

    hashlib如何加密:

    • 将一个bytes类型的数据,通过hashlib进行加密返回一个等长度的16进制数字
    • 过程不可逆
    • 相同的bytes类型的数据通过相同的加密码方法得到的数字绝对相同
    • 不相同的bytes类型的数据通过相同的加密方法得到的数字绝对不相同
    密码加密用法:
    ret = hashlib.mkd5()
    ret.update('123'.encode('utf-8'))
    print(ret.hexdigest())
    # 输出结果
    202cb962ac59075b964b07152d234b70
    
    文件一致性校验:
    def encryption(path):
    	import hashlib
    	ret = hashlib.md5()
    	with open(path, mode='rb') as f1:
    		while 1:
    			content = f1.read(1024)
    			if  content:
    				ret.update(content)
    			else:
    				return ret.hexdigest()
    a = encryption('/Users/wuqiang/Downloads/python-3.7.4rc1-embed-win32.zip')
    print(a)
    #输出结果
    
    
    加固定盐
    ret = hashlib.md5('xxx教育'.encode('utf-8'))
    ret.update('123'.encode('utf-8'))
    s = ret.hexdigest()
    print(s,type(s))
    
    #输出结果
    2230499227e2134dc58609d8c8997cd9 <class 'str'>
    
    加动态的盐
    username = input('输入用户名:').strip()
    password = input('输入密码').strip()
    ret = hashlib.md5(username[::2].encode('utf-8'))
    ret.update(password.encode('utf-8'))
    s = ret.hexdigest()
    print(s)
    
    sha系列: 安全系数高,耗时高.加盐,加动态盐
    ret = hashlib.sha512()
    ret.update('123456fdklsajflsdfjsdlkafjafkl'.encode('utf-8'))
    s = ret.hexdigest()
    print(s,type(s))
    
  • 相关阅读:
    关于Linux联网的问题
    MapD的数据导出与扩容(利用现有的表)
    系统重启后,MapD报错Thrift的连接被拒绝
    关于Linux系统只读(Ubuntu16.4.1)
    javaBean的依赖注入中构造注入和依赖注入的区别
    Struts2开发中遇到的坑。。。
    通过配置文件设置定时任务,以及时间的选择
    微信小程序开发的movable开发的坑
    spring基础概念
    Hibernate的三种查询方式
  • 原文地址:https://www.cnblogs.com/zanao/p/11107204.html
Copyright © 2020-2023  润新知