模块 类与对象
模块
- 内置模块 time, random, os, json
- 第三方模块 requests, pandas, numpy,....
- 自定义模块 xxx.py
常见的内置模块
hashlib 模块
该模块主要是进行数据加密的作用。
- 常见的加密方式:sha256()【可逆】 md5()【不可逆】
import hashlib
info = '123456'
# 创建hashlib中的加密对象
md5_obj = hashlib.md5()
# 设置编码
md5_obj.update(info.encode('UTF-8'))
# 调用函数,开始加密
mi_wen = md5_obj.hexdigest()
print(f"明文:{info},通过md5加密后得到密文:{mi_wen}") # e10adc3949ba59abbe56e057f20f883e
一般情况下,在企业中,若想要对一个明文进行MD5加密的话,一般都不是直接进行加密,而是先对名进行加盐操作,之后才会进行md5加密。
import hashlib
info = '123456'
# 创建hashlib中的加密对象
md5_obj = hashlib.md5('shujia'.encode('UTF-8')) # 加盐操作
# 设置编码
md5_obj.update(info.encode('UTF-8'))
# 调用函数,开始加密
mi_wen = md5_obj.hexdigest()
print(f"明文:{info},通过md5加密后得到密文:{mi_wen}") # 0ead149c250ec554aff85fa083312a83
json模块
本质上是一个特殊格式的字符串,但是相比较于字符串而言,json是可以通过键获取值的。
判断一个字符串是否符合json的格式:
- 看字符串是否是由双引号括起来,若不是,那么该字符串转不了json格式数据
- 若值是由小括号括起来的多个元素,也是不能够转json格式数据的
序列化和反序列化
- 序列化:将代码中的数据转化成网络中传输的数据流【python中的字典数据 --> json格式的字符串】
dict1 = {
'name': '小黄',
'age': 18,
'likes': ['踢足球', '钓鱼', '打游戏'],
'pets': [
{'name': '小花', 'age': 2},
{'name': '小黑', 'age': 3}]
}
s3 = json.dumps(dict1, ensure_ascii=False)
print(s3, type(s3))
- 反序列化:将网络中传输的数据流还原成代码中的数据格式 【json格式的字符串 --> python中的字典数据】
s2 = '''
{"name":"小黄","age":18,"likes":["踢足球","钓鱼","打游戏"]}
'''
print(s2, type(s2))
# print(s2['age'])
res1 = json.loads(s2)
print(res1, type(res1)) # {'name': '小黄', 'age': 18, 'likes': ['踢足球', '钓鱼', '打游戏']} <class 'dict'>
print(res1['likes']) # ['踢足球', '钓鱼', '打游戏']
时间相关的模块
time
import time
res1 = time.time() # 得到的是一个时间戳格式的数据
print(res1, type(time)) # 2024-11-29 10:45:58
时间戳存储时占用的字节相比较于格式化后的字符串而言,是少很多的。
datetime
时间戳,datetime, 格式化日期字符串互相转换
# '2024年11月29日 10时51分00秒'
# datetime -> str 日期格式化
res1 = datetime.strftime(s1, '%Y-%m-%d %H:%M:%S')
print(res1)
print("-------------------------------")
# time.time()
# 时间戳 -> datetime
tp = time.time() # 当前的时间戳
print(tp)
res2 = datetime.fromtimestamp(tp)
print(res2, type(res2))
# datetime -> str
res3 = datetime.strftime(res2, '%Y/%m/%d %H:%M:%S')
print(res3, type(res3))
print("-------------------------------")
# 字符串 -> datetime
s2 = '2024/11/29 11:02:28'
d2 = datetime.strptime(s2, '%Y/%m/%d %H:%M:%S')
print(d2, type(d2))
# datetime-> 时间戳
tp2 = d2.timestamp()
print(int(tp2))
date还有一种方式可以时间获取年月日时分秒, 使用datetime对象中的属性
tp = 1732849348
dt1 = datetime.fromtimestamp(tp)
print(f"{dt1.year}年{dt1.month}月{dt1.day} {dt1.hour}时{dt1.minute}分{dt1.second}秒")
os模块
使用os模块中的功能操作文件或者文件夹
- 判断目标是否存在
import os
# data/user_info
b = os.path.exists('E:\\projects\\PycharmProjects\\bigdata33\\base\\day07\\data\\user_info')
print(b) # True
- 路径拼接
s1 = os.path.join('data','user_info1')
print(s1,type(s1))
if os.path.exists(s1):
f = open(s1,'r',encoding='UTF-8')
text1 = f.read()
print(text1)
else:
print("目标路径不存在!")
- 获取当前文件所在的路径
ml1 = os.path.abspath(__file__) # __file__ 代表的是当前的文件
print(ml1, type(ml1)) # E:\projects\PycharmProjects\bigdata33\base\day07\os_demo.py
- 获取某一个文件所处的父级目录路径
ml2 = os.path.dirname(ml1)
print(ml2,type(ml2)) # E:\projects\PycharmProjects\bigdata33\base\day07
- 判断一个路径是否是文件
ml1 = os.path.abspath(__file__) # __file__ 代表的是当前的文件
print(ml1, type(ml1))
ml2 = os.path.dirname(ml1)
print(ml2,type(ml2))
print(os.path.isfile(ml1)) # True
print(os.path.isfile(ml2)) # False
- 判断一个路径是否是文件夹
ml1 = os.path.abspath(__file__) # __file__ 代表的是当前的文件
print(ml1, type(ml1))
ml2 = os.path.dirname(ml1)
print(ml2,type(ml2))
print(os.path.isdir(ml1)) # False
print(os.path.isdir(ml2)) # True
- 创建一个文件夹
lj1 = os.path.join('data','aaa')
os.mkdir(lj1)
注意:
- 若要创建一个文件夹,使用os模块中的mkdir函数
- 若要创建一个文件,使用open函数以写的方式打开
ml1 = os.path.abspath(__file__) # __file__ 代表的是当前的文件
ml2 = os.path.dirname(ml1)
res1 = os.walk(ml2)
'''
a1: 表示遍历到的文件夹的名称
b1: 表示遍历到的文件夹下所有的文件夹名称组成的列表
c1: 表示遍历到的文件夹下所有的文件名称组成的列表
'''
for a1,b1,c1 in res1:
print(f"a1:{a1}")
print(f"b1:{b1}")
print(f"c1:{c1}")
print("----------------------")
-
删除路径
- 若目标路径是一个文件
lj1 = os.path.join('data','bbb') os.remove(lj1)
- 若目标文件是一个文件夹
lj1 = os.path.join('data','aaa') os.rmdir(lj1)
-
os模块练习
- 练习1:企业中有一个网站,每一天都有新的用户注册,要求每一天需要使用一个新的文件存储当天注册的用户信息。
import os.path import time import utils.login_tool as tool from datetime import datetime # 定义一个全局变量 USERS_MU_LU = os.path.join('data','user_regs') def run(): # 判断用户存储信息的文件父级目录是否存在,若不存在创建一个 if not os.path.exists(USERS_MU_LU): os.mkdir(USERS_MU_LU) # 获取当天的时间 # 1732776554 2024-11-28 d = datetime.fromtimestamp(1732776554).strftime('%Y-%m-%d') file_name = os.path.join(USERS_MU_LU, d) if not os.path.exists(file_name): f = open(file_name,'w',encoding='UTF-8') f.close() print("欢迎注册".center(50,'-')) name = input("请输入您要注册的姓名: ") pwd = input("请输入新密码: ") pwd = tool.md5_pwd(pwd) with open(file_name,'a',encoding='UTF-8') as f: f.write(f"{name}|{pwd}\n") f.flush() time.sleep(3) print("用户注册成功!") if __name__ == '__main__': run()
- 加入判断该用户是否在之前已经注册过?
- 融合之前的登录注册案例。
- 练习2:购票,一个用户购票的记录使用一个文件存储,判断这个用户是否是新用户;不仅可以订票,还可以查看历史记录。
# 企业中有一个网站,每一天都有新的用户注册,要求每一天需要使用一个新的文件存储当天注册的用户信息。 import os.path import time import utils.login_tool as tool from datetime import datetime # 定义一个全局变量 USERS_MU_LU = os.path.join('data','user_regs') def run(): # 判断用户存储信息的文件父级目录是否存在,若不存在创建一个 if not os.path.exists(USERS_MU_LU): os.mkdir(USERS_MU_LU) # 获取当天的时间 # 1732776554 2024-11-28 d = datetime.fromtimestamp(1732776554).strftime('%Y-%m-%d') file_name = os.path.join(USERS_MU_LU, d) if not os.path.exists(file_name): f = open(file_name,'w',encoding='UTF-8') f.close() print("欢迎注册".center(50,'-')) name = input("请输入您要注册的姓名: ") pwd = input("请输入新密码: ") pwd = tool.md5_pwd(pwd) with open(file_name,'a',encoding='UTF-8') as f: f.write(f"{name}|{pwd}\n") f.flush() time.sleep(3) print("用户注册成功!") if __name__ == '__main__': run()
递归
概述:方法定义时,内部调用自身的一个现象
注意:递归要有一个出口,否则就是一个死递归
'''
从前有座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,讲的故事内容是: 故事1
从前有座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,讲的故事内容是: 故事2
从前有座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,讲的故事内容是: 故事3
从前有座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,讲的故事内容是:故事4
。。。
'''
例子
# 求5的阶乘 5! = 5*4*3*2*1
def jie_cheng(n):
if n==1:
return 1
else:
return n * jie_cheng(n-1)
res1 = jie_cheng(5)
print(res1)
异常
在python程序中出现不正常的情况
- python中默认遇到异常的处理方案:抛出错误,程序停止,后续代码不会执行。
异常的分类
- 语法错误(Syntax errors) 未运行之前出现的错误
- 会在程序编写的过程中,出现了错误【例如pycharm会在错误的语法下出现红色下划线】
- 异常(Exceptions)
- 在程序运行过程中,出现了问题
异常的处理方案
- try...except...语句
try:
list1 = [1, 2, 3]
print(list1[7])
except:
print("出错啦!!!")
print("hello world")
try中的代码,若程序运行过程中出错,那么就会执行except中的语句体,若没有出错,except语句体不会执行。不管try中的代码有没有出错,整个python程序正常运行。
当try中的代码,若程序运行过程中出错,且try中还有其他的代码的时候,不会执行。
- try...except...else语句
try:
list1 = [1, 2, 3]
print(list1[7])
print("小黄真帅!")
except:
print("出错啦!!!")
else:
print("好好学习,天天向上!")
print("hello world")
只有当try中的代码不报错的时候,才会执行else中的代码
- finally子句
try:
list1 = [1, 2, 3]
print(list1[1])
print("小黄真帅!")
except:
print("出错啦!!!")
else:
print("好好学习,天天向上!")
finally:
print("666")
print("hello world")
无论try中的代码是否报错,finally中的代码都会执行。
finally中一般情况下存放释放资源的代码逻辑
异常的使用场景
异常可以帮助我们替换一些复杂的判断场景
import random
list1 = ['小虎', '小张', '小黄', '小方', '小杨', '小于', '小查']
jiang_xiang = [
('一等奖', 1, 'mate70 pro'),
('二等奖', 1, '小米手环'),
('三等奖', 2, '按摩仪'),
('四等奖', 2, '京东购物卡')
]
def chou_jiang(l1):
for i, num, goods in jiang_xiang:
print(f"正在抽取{i}".center(50, '-'))
name_list = random.sample(l1,num)
# 将中奖名单从原名单中删除
for n in name_list:
if n in l1:
l1.remove(n)
info = f"恭喜{','.join(name_list)} 中得{i}!!!!"
yield info
res1 = chou_jiang(list1)
try:
for i in range(len(jiang_xiang)):
input(f"开始抽{i+1}等奖....按下回车开始!")
print(res1.__next__())
print(res1.__next__())
except:
print("所有奖项抽取完毕!!")
标签:__,name,记录,Python,datetime,学习,print,path,os
From: https://www.cnblogs.com/yinzhanpeng123/p/18587181