模块2
目录
os模块
文件的创建
# 该模块主要跟操作系统打交道
import os
# mkdir创建目录
os.mkdir(r'aa') # 使用相对路径在当前执行文件所在路径下创建aa文件夹
os.mkdir(r'D:\Typora\aa') #使用绝对路径创建文件
'''mkdir只能创建单级目录'''
# makedirs
os.makedirs(r'D:\Typora\aa\bb\v')
os.makedirs(r'aa\bb\b')
os.makedirs(r'd')
'''特通过绝对或者相对路径创建单极或多级目录'''
删除目录
os.rmdir(r'd') # 只能删除空的单极目录
os.removedirs(r'd\c\a') #能够删除单极空目录,逐级往上删除空目录
os.removedirs(r'/Users/jiboyuan/PycharmProjects/day21/bbb/ccc/ddd') # 删除目录之后如果外层的目录也是空的则继续删除
目录查看
'''listdir方法可以查看指定目录下的所有目录及文件夹'''
os.listdir(r'D:\Typora')
'''路径可以是绝对路径,也可以是相对当前执行文件的路径'''
文件删除与重命名
# 文件的删除
os.remove(r'a.py') # 不能对文件夹进行操作
os.rename(r'a',r'b') # 能够修改文件夹或文件的名称
获取当前路径、切换路径
os.getcwd() # 获取当前路径
os.chdir(r'D:\Typora') # 切换路径
'''在pycharm中默认路径是执行文件所在路径'''
软件开发目录规范 启动脚本兼容性操作
os.path.dirname(__file__) # 动态获取当前执行文件所在的绝对路径 D:/py/work/a
os.path.dirname(os.path.dirname(__file__)) # 每一层嵌套就往上切换一层 D:/py/work
os.path.abspath(__file__) # 动态获取当前执行文件自身路径 D:/py/work/a/test.py
判断文件是否存在
print(os.path.exists(r'db')) # 依据自身路径进行判断
print(os.path.exists(r'D:\Typora')) # 根据所给路径进行判断
print(os.path.isdir(r'a')) # 判断所给路径是不是文件夹
print(os.path.isfile(r'a')) # 判断是不是文件
路径拼接
base_dir = 'ATM'
exe_dir = '01 作业讲解.py'
'''拼接成py文件的路径'''
print(base_dir + '/' + exe_dir) # 路径分隔符在不同操作系统下不同 兼容性差
os.pas.join(base_dir,exe_dir) # 能够自动识别当前操作系统的分隔符
获取文件大小
# 获取到数据的单位是字节
print(os.path.getsize(r'a'))
小练习
# 选择指定文件并打开浏览(目前只考虑文本文件即可)
# 展示某个文件下所有的文件名称 用户选择哪个就打开哪个
import os
# 1.先获取目标文件路径(动态获取 也可以省事先写死)
target_path = os.path.dirname(__file__)
full_path = os.path.join(target_path, '好看的合集')
# 2.列举该路径下所有的文件名称
file_name_list = os.listdir(full_path) # ['','','','']
while True:
# 3.循环展示每个文件名称
for i, j in enumerate(file_name_list, start=1):
print(i, j)
# 4.获取用户选择的编号
target_num = input('请输入您想要查看的文件编号>>>:').strip()
# 5.判断是否是纯数字
if target_num.isdigit():
# 6.如果是纯数字 转换成整型
target_num = int(target_num)
# 7.判断数字在不在数量范围内
if target_num in range(1, len(file_name_list) + 1):
# 8.获取文件名称
file_name = file_name_list[target_num - 1]
# 9.拼接完整路径
full_file_path = os.path.join(full_path, file_name)
# 10.文件操作打开文件
with open(full_file_path, 'r', encoding='utf8') as f:
print(f.read())
else:
print('没有该编号的文件')
else:
print('编号只能是数字')
sys模块
'''主要跟python解释器打交道'''
import sys
# 1.列举当前执行文件所在的sys.path
print(sys.path)
# 2.获取解释器版本信息
print(sys.version)
# 3.获取版平台信息
print(sys.platform)
# 4.自定义命令操作
print(sys.argv)
# if len(sys.argv) == 3:
# username = sys.argv[1]
# password = sys.argv[2]
# if username == 'jason' and password == '123':
# print('可以正常执行该文件')
# else:
# print('用户名或密码错误 没有该文件的执行权限')
# else:
# print('请输入用户名和密码 不能漏写或多写')
json模块
'''jaon是一个序列化模块 主要用于跨语言传输数据'''
1.json格式数据是不同语言之间数据交互的媒介
json格式数据的特征是 带有双引号的字符串
2.json格式数据的具体特征
结论1中有一个小细节>>>:数据基于网络传输肯定是二进制格式
在python中bytes类型的数据可以直接看成是二级制数据
python只有字符串可以转换成bytes类型
# 由上面的推论可以得出 ,json格式数据的本质是字符串
# dumps()
dumps() 方法可以将数据转换成json格式的数据
loads() 可以将json格式的数据转换成该语言对应的数据类型
import json
dic = {'name':'jason'}
res = json.dumps(dic)
print(res,type(res)) # {"name": "jason"} <class 'str'>
res2 = json.loads(res)
print(res2,type(res2)) # {'name': 'jason'} <class 'dict'>
具体操作
"""
json.dumps() 序列化
将python数据类型转换成json格式字符串
json.loads() 反序列化
将json格式字符串转换成对应的数据类型
"""
import json
dic = {'name':'jason'}
res = json.dumps(dic)
with open(r'a.txt','w',encoding='utf8') as f:
f.write(res)
with open(r'a.txt','r',encoding='utf8') as f:
res2 = f.read()
print(res2,type(res2)) # {"name": "jason"} <class 'str'>
res3 = json.loads(res2)
print(res3,type(res3)) # {'name': 'jason'} <class 'dict'>
'''
进行文件操作是,可以将数据转换成json格式存进文件,取出来后进行反序列化,即可将文件欢原成原本的数据类型
跨语言数据交互也是同理,在python中将数据序列化后传入另外的语言反序列化后即可使用
'''
# 进行文件操作 json中有固定的方法
import json
dic = {'name':'jason'}
with open(r'a.txt','w',encoding='utf8') as f1:
json.dump(dic,f1)
with open(r'a.txt','r',encoding='utf8') as f:
data = json.load(f)
print(data,type(data)) # {'name': 'jason'} <class 'dict'>
并不是所有数据都能序列化
python | jaon |
---|---|
dict | object |
list, tuple | array |
str | string |
int,float | number |
True | true |
False | false |
None | null |
subprocess模块
import subprocess
# ls在mac终端的意思就是查看当前路径下所有的文件名称
res = subprocess.Popen('ls',
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
print('stdout',res.stdout.read().decode('utf8')) # 获取正确命令执行之后的结果
print('stderr',res.stderr.read().decode('utf8')) # 获取错误命令执行之后的结果
"""
该模块可以实现远程操作其他计算机的功能
动态获取命令执行并返回结果
eg:类似于Xshell软件的功能
"""
hashlib加密模块
# 什么是加密
将明文(人看得懂)数据通过一些手段变成密文数据(人看不懂)
密文数据的表现形式一般都是一串没有规则的字符串
# 加密算法
加密算法就是将铭文变成密文的方法,算法的难易程度可以根据产生密文的长短来判断,越长意味着越复杂
# 什么时候使用加密
涉及到隐私数据的时候 应该考虑使用加密
最为常见的就是对用户的密码加密 防止密码泄露
# 基本使用
import hashlib
# 1.指定算法
md5 = hashilib.md5
# 2.将明文数据传递给算法对象
md5.update(b'hello') # 只能接收bytes类型
'''如果数据只有数字和字符,可以在前面加b直接转成bytes类型'''
# 3.获取加密后的密文数据
res = md5.hexdigest()
'''在传入数据是,明文一致则密文一致'''
md5 = hashlib.md5()
md5.update(b'hello')
md5.update(b'world')
md5.update(b'jason')
print(md5.hexdigest()) # 8faebe82e744992e51c86845cac3e1b7
md5.update(b'helloworldjason')
print(md5.hexdigest()) # 8faebe82e744992e51c86845cac3e1b7
加密补充
# 加密后的结果无法直接反解密
所谓的反解密其实就是暴力破解,反复的猜
"""
md5解密内部本质
提前想好很多可能是密码的组合
123 自己加密
321 自己加密
222 自己加密
{'密文1':123,'密文2':321}
然后将要破解的密文与提前想好的进行比对
"""
# 加盐处理
能够增加破解的难度
import hashlib
md5 = hashlib.md5()
# 加盐处理(添加一些额外的干扰项)
md5.update('你追我'.encode('utf8'))
md5.update(b'123')
print(md5.hexdigest()) # ce850e70febde5f3506fec0479dc0f96
# 动态加盐
干扰项动态变化
可以是用户名的一部分,也可以是当前时间
"""
加密应用场景
1.密码加密如何比对
用户输入的还是明文但是到了程序里面之后会采用相同的加密算法变成密文
之后拿着密文与跟数据库里面的密文比对如果一致就是密码正确不一致就是错误
2.文件内容一致性校验
作为软件的提供者 我们在提供安全软件的同时会对给该软件内容做加密处理得到一个该安全软件独有的密文
用户在下载软件之后也会对内容做相同的加密之后比对两次密文是否一致
如果是表示中途没有被修改 如果不是表示中途被修改过 可能存在病毒
"""
针对大文件一致性校验的优化策略
如果一个文件有10G 那么如果全部读取并加密速度太慢
这个时候可以考虑对文件内容进行切片读取并加密的操作
login模块
'''日志模块就是在程序的各个环境记录 便于后续的查看'''
# 针对日志模块 我们只需要听流程思路 最后CV即可 无需详细记忆
# 1.日志等级
import logging
# 日志按照重要程度分为五个级别:默认只有达到warning警告级别及以上才会记录日志
logging.debug('debug message') # 10
logging.info('info message') # 20
logging.warning('warning message') # 30
logging.error('error message') # 40
logging.critical('critical message') # 50
# 2.基本使用
import logging
file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8', )
# 所有的格式不需要记忆 后续几乎都是拷贝加修改
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[file_handler, ],
level=logging.ERROR
)
logging.error('错了')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人