Day25常见的内置模块

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)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值