Python进阶(九)----json模块, pickle模块, os模块,sys模块,hashlib模块

mac2022-06-30  77

Python进阶----json模块, pickle模块, os模块,sys模块,hashlib模块

一丶序列化模块

什么是序列化:

​ 将一种数据结构,转换成一个特殊的序列(特殊字符串,用于网络传输,或文件保存)

​ 真正的意义:变量从内存中变成可存储或传输的过程称之为序列化

json模块:

​ 是所有语言公认的一种序列,最常用,支持的数据结构有限:"list(tuple), int .str ,bool,None,float."

### dumps ,loads : 主要网络传输 , 用于文件的读取. import json # 写入 json文件 dumps() 将内容序列化 dic = {'username': '坚决不打广告', 'password': 123,'status': False} with open('1.json','w',encoding='utf-8') as f: # ensure_ascii是否使用二进制, sort_keys排序,按照键排序 f.write(json.dumps(dic,ensure_ascii=False,sort_keys=True)) # 读出json文件 loads() 将内容反序列化 with open('1.json','r',encoding='utf-8') as f2: ret=json.loads(f2.read()) print(ret) ### dump load : 单个数据的存取文件 import json #写 dump() 把数据(保存的内容)和文件句柄(f)传给此函数,默认会把要保存的内容转换成字符串格式 dic = {'username': '坚决不打广告', 'password': 123,'status': False} with open('2.json','w',encoding='utf-8') as f: json.dump(dic,f) #读 with open('2.json', 'r', encoding='utf-8') as f2: content_dic = json.load(f2) print(content_dic) #### 序列化多个字典 , (一个dump 对应一个load) # 写入2.json文件 dic1 = {'username': '坚决不打广告1', 'password': 123,'status': False} dic2 = {'username': '坚决不打广告2', 'password': 123,'status': False} dic3 = {'username': '坚决不打广告3', 'password': 123,'status': False} with open('2.json','w',encoding='utf-8') as f: # ensure_ascii是否使用二进制, sort_keys排序,按照键排序 f.write(json.dumps(f'{dic1}\n{dic2}\n{dic3}',ensure_ascii=False,sort_keys=True)) # 读出2.json文件 with open('1.json','r',encoding='utf-8') as f2: ret1=json.loads(f2.read()) print(ret1,ret2,ret3)

pickle模块:

​ 只支持python语言所有的数据类型序列化

### dumps() , loads() : 只能是网络传输 ,直接转换成bytes li=['wusir','tb'] ret=pickle.dumps(li) # 将数据转换成bytes类数据 ,进行序列化 print(ret) res=pickle.loads(ret) # 将bytes数据转反序列化 print(res) #### dump(), load() : 数据结构存取文件 li=['wusir','tb'] # 写入文件 with open('pickle.pick','wb') as f : # 写入的是字节类型的数据 pickle.dump(li,f) # 读取文件 with open('pickle.pick','rb') as f : ret=pickle.load(f) print(ret) #### 写入多个文件,读取多个文件, (一个dump 对应一个load) li1=['wusir1','tb'] li2=['wusir2','tb'] li3=['wusir3','tb'] # 写入文件 写入的是字节类型数据 with open('pickle1.pick','wb') as f1: pickle.dump(li1,f1) pickle.dump(li2,f1) pickle.dump(li3,f1) # 读文件 读取的字节类型数据 with open('pickle1.pick','rb') as f2: re1=pickle.load(f2) re2=pickle.load(f2) re3=pickle.load(f2) print(re1,re2,re3)

shevle模块:

​ shelve是一额简单的数据存储方案,他只有一个函数就是open(),这个函数接收一个参数就是文件名,并且文件名必须是.bat类型的。然后返回一个shelf对象,你可以用他来存储东西,就可以简单的把他当作一个字典,当你存储完毕的时候,就调用close函数来关闭 ---so 不会用. 用时去百度

二丶os模块

##### 最重要, 开发必备 ? ##### 多数操作系统的功能接口函数 import os print(os.getcwd()) ## 获取当前的工作目录 绝对路径 print(os.chdir(r'E:\File\oldboy学习笔记\Python之路\day16' )) #切换路径 print(os.curdir) # 当前路径 print(os.pardir) # 父级路径路径 ### 和文件夹相关的 os.makedirs('d111/d222/d333') # 递归创建多级目录 os.removedirs('d111/d222/d333') # 递归删除目录,如果当前目录下还有文件,就删除不了 os.mkdir('d1')# 创建单级目录 os.rmdir('d1') # 删除单级目录 print(os.listdir('E:\File\oldboy学习笔记\Python之路\day17')) # 列举绝对路径下的所有文件 ### 和文件相关 os.remove('路径') # 删除目录 os.rename('路径') # 重命名 print(os.stat(r'E:\File\oldboy学习笔记\Python之路\day17\01 序列化模块.py')) # 获取文件的具体信息 print(os.environ) #获取环境变量 ### path 和路径相关 print(os.path.abspath('1.json')) # 获取某文件的绝对路径 print(os.path.split(os.path.abspath('1.json'))) # 将文件名和扩展名分开 ,以路径文件名前的符号作为分隔符, 将工作路径(父级目录)和文件名切割成两个元素 print(os.path.dirname('1.json')) # 获取当前文件的父级目录 print(__file__) # 动态获取当前文件的绝对路径 print(os.path.basename('1.json')) # 获取文件的文件名 print(os.path.exists('1.json')) # 判断文件或者目录是否存在 print(os.path.isabs(r'02 JSON序列化.py')) # 判断是不是一个绝对路径 print(os.path.isabs(r'E:\File\oldboy学习笔记\Python之路\day17\01 序列化模块.py')) print(os.path.isfile('1.json')) # 判断该路径是不是一个文件路径 print(os.path.isdir()) # 判断是不是一个目录 ### 拼接路径( 重重之重 ) rabs_path=os.path.dirname(__file__) #__file__是获得当前文件的绝对路径,dirname是获取父目录 print(os.path.join(rabs_path,'aaa','bbb')) # 拼接一个路径, 放置字符串就ok 不用写正反斜杠 #结果: D:/XXX/XXX\aaa\bbb # 获取文件最后访问的时间 print(os.path.getatime('1.json')) # 获得文件最后修改的时间 print(os.path.getmtime('1.json')) # 获得文件的大小 print(os.path.getsize('1.json'))

三丶sys模块

### 系统模块 import sys print(sys.path) # 获取当前工作路径 ,会得到一个列表. sys.path比较常用 print(sys.version) # 获取python解释器版本 print(sys.exit()) # 主动退出程序 print(sys.platform) # 查看系统 sys.modules[__name__] # 获取当前脚本对象

四丶hashlib模块

#### 加密 模块 , 摘要算法, 散列算法 , 它是一堆加密算法的集合 #### 明文形式的存储,带来安全隐患 import hashlib # 1. 将一个bytes类型的数据 ,通过hashlib进行加密.返回等长的16进制的数字 # 2. 过程不可逆 # 3. 相同的bytes类型的数据通过相同的加密方法,得到的数字绝对相同 # 4. 不相同的bytes类的数据通过相同的加密算法,得到数字绝对不同 ### 使用步骤: # 1.声明hashlib模块 # 2. 创建 hashlib.md5 对象(容器) # 3. update() 对字节文件进行md5加密 # 4. hexdigest() 返回32位16进制的数字 ## 加密 一 md5 ret=hashlib.md5() ret.update('abcd多撒多撒efg'.encode('utf-8')) s=ret.hexdigest() print(s) print(len('df938391a6b68aaa624876a259064135')) # 32 ## 校验文件或文件内容的一致性 ret1=hashlib.md5() ret1.update('alex'.encode('utf-8')) s2=ret1.hexdigest() print(s2) ret2=hashlib.md5() ret2.update('alex'.encode('utf-8')) s1=ret2.hexdigest() print(s1) ## 撞库 # 闲人没日没夜的随机利用md5加密算算法,随机生成结果,并保存 ## 加盐 在创建md5对象ret生成的时候 ,加盐,提高安全性 ret=hashlib.md5('txdy001'.encode('utf-8')) ret.update('123*456'.encode('utf-8')) s=ret.hexdigest() print(s) ## 动态的加盐 顾名思义 username=input('请输入用户名').strip() pwd=input('q请输入密码').strip() ret=hashlib.md5(username[::2].encode('utf-8')) ret.update(pwd.encode('utf-8')) s=ret.hexdigest() print(s) ##### sha 系列 : 安全系数最高,耗时高 shaRet=hashlib.sha512() shaRet.update('123'.encode('utf-8')) s=shaRet.hexdigest() print(s) print(len('3c9909afec25354d551dae21590bb26e38d53f2173b8d3dc3eee4c047e7ab1c1eb8b85103e3be7das13b31bb5c9c36214dc9f14a42fd7a2fdb84856bca5c44c2')) # 128

番外篇:md5的常规操作

#### 分步计算md5值,最后组合 import hashlib ### low版验证一个文件的的md5值 ret =hashlib.md5() with open('md5校验','rb') as f1: content=f1.read() ret.update(content) s1=ret.hexdigest() print(s1) # 68172d54bcd00a912c43961825c18062 ret1 =hashlib.md5() with open('md5校验1','rb') as f2: content=f2.read() ret1.update(content) s2=ret1.hexdigest() print(s2) # 68172d54bcd00a912c43961825c18062 #### 校验官方文档的 md5 with open('python-3.7.4rc1-embed-win32.zip','rb') as f: content=f.read() ret=hashlib.md5() ret.update(content) print(ret.hexdigest()) # d9c18c989c474c7629121c9d59cc429e # d9c18c989c474c7629121c9d59cc429e #### 分步骤计算 update def md5_file(path): ret = hashlib.md5() with open(path, 'rb') as f: while 1: content=f.read(1024) # 每次只读 1024字节, 节省内存 if content: ret.update(content) # update的功能:会把每次生成的md5值拼在一起. else: return ret.hexdigest() print(md5_file('python-3.7.4rc1-embed-win32.zip'))

转载于:https://www.cnblogs.com/dengl/p/11099451.html

最新回复(0)