Python进阶----os,sys,hashlib模块
Posted dengl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python进阶----os,sys,hashlib模块相关的知识,希望对你有一定的参考价值。
Python进阶(九)----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\ndic2\ndic3',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) # 查看系统
四丶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()
#-------------------------
# for line in f:
# ret.update(line)
# print(ret.hexdigest())
print(md5_file('python-3.7.4rc1-embed-win32.zip'))
五丶conllections模块
以上是关于Python进阶----os,sys,hashlib模块的主要内容,如果未能解决你的问题,请参考以下文章