Day25常见的内置模块
文章目录
1、datetime模块
与time模块类似,都是与时间操作有关
import datetime
res=(datetime.datetime.today()) #取现在的时间 非常精确
print(res)
print(res.date())
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2022-07-15 14:41:15.195397
2022-07-15
在取出的时间中获取
关键字 | 取值 |
---|---|
year | 年 |
moth | 月 |
weekday | 第几周 |
isoweekday | 第几工作日 |
1.1、时间差计算 定时
timedelta() 可以通过括号内加参数来定义时间差
import datetime
res=(datetime.datetime.today())
time_1=datetime.timedelta(hours=24)
res_2=(res + time_1) # 通过时间加时间差 得出将来时间
print(res_2)
print(res_2 - res) #通过将来时间 减现在时间 得出时间差
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2022-07-16 15:05:58.788577
1 day, 0:00:00
时间功能拓展
import datetime
print(datetime.datetime.now())
print(datetime.datetime.utcnow())
print(datetime.datetime(2023, 7, 15, 15, 16))
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2022-07-15 15:16:46.320891
2022-07-15 07:16:46.320891
2023-07-15 15:16:00
2、os模块
os 模块主要是根当前程序所在的操作 系统打交道
函数名 | 功能 |
---|---|
mkdir | 创建单级目录 |
makdirs | 创建多级目录 |
rmdir | 删除单机目录 |
removedirs | 删除多级目录 |
lisdir | 获取指定路径下目录与文件(列表形式返回) |
rename | 重命名指定文件 |
remove | 删除指定文件 |
getcwd | 查看 当前操作路径(绝对路径) |
chdir | 操作路径 |
函数名 | 功能 |
---|---|
path.abspath(__file__ ) | 获取当前文件的绝对路径 |
paht.dirname(__file__ ) | 获取当前文件的绝对路径 |
exists | 判断是否存在该目录,文件 |
isdir/isfile | 判断是否存在该目录/文件 |
path.join | 拼接路径专用 |
创建目录,创建多级目录
-
mkdir
-
makedirs
-
mkdir 无法创建多级目录
import os
import os
os.mkdir(r'b') # 创建单级目录 mkdir只能创建单极
os.makedirs(r'b\aa\cc')
os.makedirs(r'c') # 既可以创建多级 也可以创单极
删除目录
-
rmdir
-
removedirs
-
rmdir 只能删除单机目录
-
rmdir与removedirs都无法删除目录下有数据的目录
import os
os.rmdir(r'c') # 删除单级目录
os.removedirs(r'b\aa\cc') # 删除多级目录或单机目录
以列表形式取出 路径下目录及文件
listdir
目录及文件都会组成一个列表返回
import os
print(os.listdir()) #获取当前路径下的所有目录 及文件
print(os.listdir(r'D:\\')) #获取指定文件下的目录 文件
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
['.idea', 'a.py', 'b', 'c']
删除指定文件,或重命名文件
rename
,remove
import os
os.rename(r'b.py',r'c.py') #重命名b.py为c.py
os.remove(r'b/aa/cc/a.py') # 删除指定文件
获取当前工作路径(绝对路径)
getcwd
chdir
import os
print(os.getcwd()) # 获取当前路径
os.chdir(r'..') 返回到上级路径
os.makedirs(r'kk') 在当前路径下创建kk目录
print(os.getcwd()) 查看当前路径(此时为上一层)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
D:\Day25
D:\
获取当前文件的绝对路径 和 获取当前文件所在的路径 (绝对路径)
-
path.abspath(__file__)
-
path.dirname(__file__)
-
很常用,一般用于执行文件 获取当前根目录 添加到程序变量中
import os
print(os.path.abspath(__file__)) #获取当前文件的 绝对路径
print(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) # 获取当前文件的目录绝对路径
判断 目录或文件是否存在
-
exists
-
isdir
isfile
-
存在返回True 不存在返回False
-
isdir只能检测目录(文件夹)
-
isfile 只能检测文件
import os
print(os.path.exists(r'c.py')) # 判断当前路径是否存在该文件
print(os.path.exists(r'b\aa\cc\dd')) # 判断是否存在该目录
print(os.path.isdir(r'b\aa')) # 判断是否存在该目录
print(os.path.isfile(r'c.py')) # 判断文件是否存在
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
True
False
拼接路径
path.join
import os
res_path='a.py'
res1_path=r'D:\Day25\b\aa\cc'
res2_path=(os.path.join(res1_path, res_path))
print(res2_path)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
D:\Day25\b\aa\cc\a.py
3、sys模块
sys 模块主要是根pyth解释器打交道的
查看 程序环境变量 解释器信息等
import sys
print(sys.path) # 查看程序环境变量
print(sys.version) # 查看python解释器当前的版本信息
print(sys.platform) # 查看当前平台
将python解释器中断运行时
res=(sys.argv)
print(res)
if len(res) == 3:
username = res[1]
password = res[2]
if username == 'kk' and password == '123':
print('您可以正在执行该文件')
else:
print('用户名或密码错误')
else:
print('请填写用户名和密码')
4、json 模块
json模块 也称为序列化模块
json模块是不同编程语言交互的必备模块
json格式的数据应该是说明
数据在网络传输都是以二进制形式,那么在python中,只有字符串可以调用编码encode方法转成二进制,所以json的格式数据也属于字符串
json格式的数据特征:
json格式的数据 输出它的引号为双引号
关键字 | 功能 |
---|---|
dumps | 将其他数据类型转换为json格式字符串 |
loads | 将json格式字符串转化为对应数据类型 |
dump | 将其他数据以json格式字符串写入文件 |
load | 将文件中json格式字符串读取出来转化为对应的数据类型 |
dumps与loads用法
import json
dict_1={'name':'kk','age':'18','gender':'male'}
res=json.dumps(dict_1) # 利用 dumps将字典转为json 字符串 形式
print(res)
with open(r'username','w',encoding='utf')as f,open(r'username','r',encoding='utf')as read_1:
f.write(res) # 将json字符串形式的 字符串写入文件中
f.flush() # 保存文件
res_1=read_1.read() #将写入的 jason 字符串读出
print(json.loads(res_1)) # 利用loads转回字典
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
{"name": "kk", "age": "18", "gender": "male"}
{'name': 'kk', 'age': '18', 'gender': 'male'}
dump 与load用法
import json
dict_1={'name':'kk','age':'18','gender':'male'}
with open(r'username','w',encoding='utf')as f,open(r'username','r',encoding='utf')as read_1:
json.dump(dict_1,f) # 利用dunmo直接将字典变为 json格式字符串并自动传入文件中
f.flush() # 保存
print(json.load(read_1)) # 利用 load 将文件一次性读出 然后转化为字典数据类型
作业
1、编写一个统计指定文件类型的脚本工具
输入指定类型的文件后缀
eg:.txt
并给出一个具体路径 之后统计该类型文件在该文件下的个数
ps:简单实现即可 无需优化
import os
#接受统计文件的路径
path_user=input('请输入文件路径>>>>').strip()
#接受统计的文件类型
type_1=input('请输入要你统计的文件类型后缀').strip()
count=0
path_1=os.listdir(path_user)
print(path_1)
for file_name in path_1:
if file_name.endswith(r'%s'%type_1):
count+=1
print(f'{type_1}为后缀的文件个数为{count}')
2、针对json实操 尝试单文件多用户(一行一个)是否可实现 哪个更方便
import os
import json
path_1=os.path.dirname(os.path.dirname(__file__))
if 'db'not in os.listdir(path_1):
os.makedirs('db')
path_txt=os.path.join(path_1,'db','userinfo.txt')
user_name=input('username>>>')
with open(path_txt,'a',encoding='utf')as user_w,open(path_txt,'r',encoding='utf')as user_r:
for user_info in user_r:
user_info_dict=json.loads(user_info)
if user_name==user_info_dict['username']:
print('账号已存在')
break
else:
user_pad=input('userpassword>>>')
#创建信息格式
user_dict={'username':user_name,
'userpad':user_pad,
'balance':1500,
'shop_car':[]}
list_json=json.dumps(user_dict)
with open(path_txt,'a',encoding='utf')as user_w,open(path_txt,'r',encoding='utf')as user_r:
user_w.write(f'{list_json}\n')
- 可以实现 不过json格式传入文件 嘚全部手动用dunps和loads传取
- 单行 还导致 每个人信息只能是一个数据类型
3、编程小练习
文件内容自定义即可 要求循环打印出db目录下所有的文件名称让用户选择
用户选择哪个文件就自动打开该文件并展示内容
涉及到文件路径全部使用代码自动生成 不准直接拷贝当前计算机固定路径
import os
path_1=os.path.dirname(__file__)
path_db=os.path.join(path_1,'db')
file_list=os.listdir(path_db)
choose_dict=dict(zip(range(10),file_list))
for i in choose_dict.items():
print(i)
user_choose=int(input('请输入要打开的文件>>>'))
if user_choose in choose_dict:
file_1=choose_dict[user_choose]
path_file=os.path.join(path_db,file_1)
with open(path_file,'r')as res:
res.read()
else:
print('无此选项文件'
4、大作业
strat.py
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from core import src
func_choose={'1':src.reg,
'2':src.log,
'3':src.choopcart,
'4':src.settlement,
'5':src.log_out
}
while True:
print('购物系统'.center(50,'='))
choose=input('1.注册用户\n2.登录用户\n3.添加购物车\n4.购物车结算\n5.退出登录\n0.退出\n>>>')
if choose in func_choose:
func_choose[choose]()
elif choose=='0':
break
else:
print('无此功能')
src.py
import os
import json
import re
path_root = os.path.dirname(os.path.dirname(__file__))
path_db = os.path.join(path_root, 'db')
# user_list = os.listdir(path_db)
oline={'user':None,'accout':{}}
path_list=[None]
good_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]
]
# 用户注册
def reg():
# print(path_root)
if 'db' not in os.listdir(path_root):
os.makedirs(path_db)
user_list = os.listdir(path_db)
reg_name = input('legname>>>')
user_txt = f'{reg_name}' + '.json'
if user_txt in user_list:
print('用户已存在')
return
reg_pad = input('legpassword>>>')
user_info = {'name': reg_name, 'pad': reg_pad}
path_user = os.path.join(path_db, user_txt)
user_shopping = {'balance': 15000, 'shop_car': {}}
with open(path_user, 'w', encoding='utf')as user_w, open(path_user, 'a', encoding='utf')as user_a:
user_w.write(f'{json.dumps(user_info)}\n')
user_w.flush()
json.dump(user_shopping, user_a)
# 用户登录 校验 装饰器
def decorator(func_1):
def other(*args, **kwargs):
try:
user_list = os.listdir(path_db)
except Exception :
print('请先注册账户')
else:
if oline['user']!=None:
res = func_1(*args, **kwargs)
return res
else:
log_name = input('username>>>')
user_txt = f'{log_name}' + '.json'
path_user = os.path.join(path_db, user_txt)
for file_txt in user_list:
# print(user_list)
if user_txt == file_txt:
with open(path_user, 'a', encoding='utf')as user_a, open(path_user, 'r', encoding='utf')as user_r:
log_pad = input('userpassword>>>')
user_info = json.loads(user_r.readline())
if user_info['pad'] == log_pad:
print('登录成功')
#将登录的账号放入全局字典
oline['user']=user_info['name']
#将账户钱包放入全局
oline['accout'] = json.loads(user_r.readline())
path_list.clear()
path_list.append(path_user)
# print(path_list)
res = func_1(*args, **kwargs)
return res
else:
print('密码错误')
else:
print('账号不存在')
return False
return other
# 登录功能
@decorator
def log():
user_name=oline.get('user')
accout_user=oline.get('accout')
print(f'用户:{user_name}\n'
f'余额:{accout_user["balance"]}'
f'购物车:{accout_user["shop_car"]}')
# 文件修改 函数 非项目功能
def modf():
path_user = path_list[0]
with open(path_user, 'r', encoding='utf')as user_r:
#读取获取文件内容
data_1=user_r.read()
#重置光标
user_r.seek(0)
user_r.readline()
#读取文件中 账户内容
data_2=user_r.readline()
# print(data_1)
#从全局中获取实时购物车 并转换为 json格式
data_3=json.dumps(oline['accout'])
# print(data_3)
#修改 账户内容
new_data=data_1.replace(data_2,data_3)
#写入账户内容
with open(path_user, 'w', encoding='utf')as user_w:
user_w.write(new_data)
user_w.flush()
# 添加购物车
@decorator
def choopcart():
path_user=path_list[0]
print('购物车功能')
print('商品选择'.center(40, '+'))
count=0
for goods in good_list:
print(f'商品编号:{count},商品:{goods[0]} 价格{goods[1]}$')
count+=1
# 接受用户 选择的商品
while True:
choose=input('请输入您要购买的商品编号>>').strip()
number_of=input('请输入您要购买的商品数量>>>').strip()
if choose.isdigit() and number_of.isdigit():
choose=int(choose)
number_of=int(number_of)
else:
print('请 输数字啊 ')
#获取用户选择商品
goods_user_list=good_list[choose]
#获取全局的账户
account_user=oline.get('accout')
#获取全局账户中的购物车
shopping_cart=account_user['shop_car']
#将买好的商品装入全局购物车
# print(goods_user_list[0])
# print(shopping_cart)
if goods_user_list[0] in shopping_cart:
number_1=shopping_cart[goods_user_list[0]][0]
number_of=number_of+number_1
shopping_cart[goods_user_list[0]]=[number_of,goods_user_list[1]]
modf()
print('添加成功')
if input('按任意键继续选购\n按0 返回菜单')=='0':
break
# 结算购物车
@decorator
def settlement():
path_user = path_list[0]
account_user = oline.get('accout')
# 获取全局账户中的购物车
shopping_cart_dict = account_user['shop_car']
# print(shopping_cart_dict)
balance=account_user["balance"]
print(f'您的账户余额:{balance}$')
print('购物车:'.center(30,'-'))
# 给用户展示购物车内商品
#创一个大的空列表 用来装 用户购物车的商品信息
while True:
settl=[]
count=0
for goods,price in shopping_cart_dict.items():
print(f'|{count}|商品:{goods} 数量:{price[0]} 单价:{price[1]}$')
#将商品 信息全部 装进一个列表中 后再装入大列表
settl.append([count,goods,price[0],price[1]])
count+=1
#接受用户 需要结清的商品
choose=input('请输入车内您要结清的选项\n返回请输入exit\n>>>').strip()
if choose=='exit':
break
# 获取用户输入数字 数据
item=re.findall('[0-9]',choose)
# 判断 数据 不能大于 购物车内最大的 编号 并且都转为整型
new_item=[int(i) for i in item if int(i) <=count]
print(new_item)
#循环取出 用户要结算的商品编号
for i in new_item:
#将编号当作索引 取出大的购物车信息列表
goods_info=settl[i]
# 取出 该商品的单价
price_1=int(goods_info[2])
# 取出该商品的数量
numb=int(goods_info[3])
# 取出该商品的 名字
goods_name=goods_info[1]
price_2=price_1*numb
print(f'您需支付{price_2}$')
if price_2>balance:
print('余额不足')
else:
account_user["balance"]=balance-price_2
del shopping_cart_dict[goods_name]
print('支付成功')
print(oline)
modf()
@decorator
def log_out():
oline['user']=None
print('退出登录成功')
if __name__ == '__main__':
# reg()
choopcart()
# settlement()
print(oline)