【修仙】第一卷 初出茅庐 第二十三章 模块3

前情提要

模块的绝对导入与相对导入

绝对导入

始终以当前执行文件的sys.path为基准
ps:项目根目录最好自己再添加一遍

相对导入

模块文件之间的导入会使用到相对导入
但绝对导入更好

标点 作用
. 当前文件路径
.. 上一级文件路径
../.. 上上级文件路径

包的概念

本质

就是存储多个py文件的文件夹

image

目的

方便管理

语句

import 包名

这里导入的其实是包内的__init__.py文件
这个__init__.py文件可以用于管理包内的模块 但在python3中其实作用也不大

不同版本解释器的差异

python3

在包中可以不创建__init__.py文件
也可以绕过__init__.py文件直接导入包内的模块

python2

包中严格要求有__init__.py文件 否则无法导入

编程思想的转变

转变的目的

为了更加方便、高效、快捷的管理代码

阶段 编写方式
小白 面条版本:只会从上往下的按要求编写
函数 函数版本:将功能封装为模块
模板 模板版本:将相似的功能拆分为模块文件

软件开发目录规范

目的

为了更加方便、高效、快捷的管理代码

文件夹 作用 内含文件
conf 存储程序的配置文件 settins.py
core 存储程序的核心功能 src.py
bin 存储程序的启动文件 start.py
lib 存储程序的公共功能 common.py
db 存储程序的数据文件 userinfo.txt
log 存储程序的日志文件 log.log
interface 存储程序的接口文件 user.py、good.py
readme(单个文件) 用于介绍程序的功能 \
requirements.txt(单个文件) 记录了项目所需的第三方模块名称和版本信息 \

常见模块之collections模块(了解)

作用

给我们提供了更多的数据类型

名字 类型
namedtuple 具名元组
deque 双端队列
OrderedDict 有序字典
defaultdict 默认值字典
counter 计数器

常见模块之time模块

作用

提供了很多时间的操作

函数 作用
time() 获取时间戳
localtime() 获取结构化时间
gmtime() 获取英国伦敦的结构化时间
strftime() 根据某舟格式来格式化时间
sleep() 程序在原地等待自定义的时间

时间的格式

在striftime()中输入特定的格式可以获取特定的时间字符串

import time

res = time.strftime('%Y-%m-%d %H:%M:%S')
print(res)  # 2022-07-15 17:11:02

res = time.strftime('%Y-%m-%d %X')
print(res)  # 2022-07-15 17:11:02
格式 作用
%Y 获取年份
%m 获取月份
%d 获取天份
%H 获取小时
%M 获取分钟
%S 获取秒数
%X 获取时分秒

今日内容

datetime模块

是什么东西

与time模块类似 都是与时间操作相关的模块

使用

import datetime

res = datetime.datetime.today()
print(res)  # 2022-07-15 17:18:49.814341
res1 = datetime.date.today()
print(res1)  # 2022-07-15
"""
date        年月日
datetime    年月日 时分秒
"""

print(res.year)  # 2022
print(res.month)  # 7
print(res.day)  # 15
print(res.hour)  # 17
print(res.minute)  # 22
print(res.second)  # 16
print(res.weekday())  # 4
print(res.isoweekday())  # 5
"""
year    年
moth    月
day     日
hour    时
minute  分
second  秒
weekday()   周几  周一为0
isoweekday()周几  周一为1
"""

# timedelta 日期延期/提前
res = datetime.date.today()
tl = datetime.timedelta(days=3)
print(res)  # 2022-07-15
print(res + tl)  # 2022-07-18
print(res - tl)  # 2022-07-12
"""
timedelta括号内有很多参数 没有的时间可以通过换算得来
"""

os模块

语句

# 导入
import os
import os
# 创建目录  mkdir()  makedirs()
os.mkdir(r'aaa')  # 创建单级文件 但不能创建多级文件 但mkdir该语句在很多系统都通用
os.makedirs(r'aaa\bbb\ccc')  # 创建多级文件 也可以创建单级文件
import os
# 删除目录  rmdir() removedirs()
os.rmdir(r'aaa')  # 删除单级文件 但文件内不能有数据 不能删除多级文件

os.removedirs(r'aaa\bbb\ccc')  # 可以删除多级文件 
# 但若文件内有数据则无法删除 从内到外依次删除空的文件夹 直到遇到有数据的文件夹
import os
# 列举指定文件下的文件名称 listdir()  结果返回的是列表
# aaa文件夹中有 a.py b.py c.py
res = os.listdir(r'aaa')
print(res)  # ['a.py', 'b.py', 'c.py']
import os
# 重命名文件 rename() 删除文件 remove()
os.rename('a.txt', r'aaa.txt')  # 将a.txt更改为aaa.txt
os.remove('aaa.txt')  # 删除aaa.txt
import os
# 获取当前工作路径  getcwd()  获取的是绝对路径
print(os.getcwd())  # F:\pythonProject\day24
os.chdir(r'..')  # chdir() 类似 控制台中的cd
print(os.getcwd())  # F:\pythonProject
import os
# 与程序启动文件相关
print(os.path.abspath(__file__))  # 获取当前文件的绝对路径(可以不记)
print(os.path.dirname(__file__))  # 获取当前文件所在的目录路径(必须得记)
import os
# 判断路径是否存在(文件、目录)  exists()  isdir()  isfile()
# exists() 就像 isdir() 和 isfile() 功能的结合版
# isdir() 只能判断路径是否是目录(既文件夹)
# isfile() 只能判断路径是否是文件
# exists() 可以判断路径是否存在
import os
# 拼接路径  join()
relative_path = 'a.txt'
absolute_path = r'D:\pythonProject\day24\ccc\ddd\eee'
res = os.path.join(absolute_path, relative_path)  # 两个路径之间会根据当前系统自动添加\或/(不同系统之间路径的分隔符不同)
print(res)  # D:\pythonProject\day24\ccc\ddd\eee\a.txt
import os
# 获取文件大小 getize()
# a.txt 的内容如下
# 你好aaaa
print(os.path.getsize(r'a.txt'))  # 10  计算的是字节量  1个中文3字节 1个英文1个字节 所以是10字节

sys模块

语句

import sys

print(sys.path)  # 结果是列表
print(sys.version)  # 查看解释器版本信息
print(sys.platform)  # 查看当前平台
res = sys.argv
"""需求 命令行执行当前文件必须提供用户名和密码 否则不准执行"""
if len(res) == 3:
    username = res[1]
    password = res[2]
    if username == 'jason' and password == '123':
        print('您可以正常执行该文件')
    else:
        print('用户名或密码错误')
else:
    print('请填写用户名和密码')
# 上述校验也可以使用异常捕获实现(课下实现)

res = sys.argv
try:
    username = res[1]
    password = res[2]
    if username == 'jason' and password == '123':
        print('您可以正常执行该文件')
    else:
        print('用户名或密码错误')
except IndexError:
    print('请输入用户名和密码')

json模块

语句

import json

res = json.dumps(d)  # 序列化 将其他数据类型转换成json格式字符串
print(res, type(res))  # {"name": "jason", "pwd": 123} <class 'str'>
res1 = json.loads(res)  # 反序列化 将json格式字符串转换成对应编程语言中的数据类型
print(res1, type(res1))  # {'name': 'jason', 'pwd': 123} <class 'dict'>


"""
dumps()     将其他数据类型转换为json格式字符串
loads()     将json格式字符串z换行成对应的数据类型

dump()      将其他数据类型直接以json格式字符串写入文件
load()      将文件中json格式字符串读取出来并转换成对应的数据类型
"""

作业

# 1.编写一个统计指定文件类型的脚本工具
# 	输入指定类型的文件后缀
#     	eg:.txt
# 	并给出一个具体路径 之后统计该类型文件在该文件下的个数
#  	ps:简单实现即可 无需优化
import os
while True:
    file_type = input('请输入要查看个数的文件类型(如.txt .py)>>>:').strip()
    if file_type[0] != '.':
        print('请输入合法的后缀(如 .txt .py)')
        continue
    file_path = input('请输入要查询的具体路径>>>:').strip()
    try:
        file_list = os.listdir(file_path)
    except FileNotFoundError:
        print('路径不正确')
        continue
    type_len = len(file_type)
    count = 0
    for file in file_list:
        if file[len(file)-type_len: len(file)] == file_type[len(file_type) - type_len: len(file_type)]:
            count += 1
    print(count)
# 2.针对json实操 尝试单文件多用户(一行一个)是否可实现 哪个更方便
import os
import json
while True:
    # 获取用户输入
    username = input('请输入用户名>>>:').strip()
    password = input('请输入密码>>>:').strip()
    # 获取用户列表
    user_list = []
    with open('userinfo', 'r', encoding='utf8') as f:
        for user_info in f:
            user_info = user_info.strip('\n')
            user_list.append(json.loads(user_info))
    # 判断用户是否存在 及 登录校验
    for user in user_list:
        if username == user['username']:
            if password == user['password']:
                print('登录成功')
                break
    else:
        print('账号或密码错误')

    # 判断用户是否存在 及 注册功能
    for user in user_list:
        if username == user['username']:
            break
    else:
        user_dict = {'username': username, 'password': password}
        with open('userinfo', 'a', encoding='utf8') as f:
            user_info = json.dumps(user_dict)
            f.writelines(user_info + '\n')
# 3.编程小练习
# 	有一个目录文件下面有一堆文本文件
#     	eg:
#     		db目录
#             J老师视频合集
#             R老师视频合集
#             C老师视频合集
#             B老师视频合集
# 	文件内容自定义即可 要求循环打印出db目录下所有的文件名称让用户选择
#  	用户选择哪个文件就自动打开该文件并展示内容
#  	涉及到文件路径全部使用代码自动生成 不准直接拷贝当前计算机固定路径

import os
while True:
    # 获取好康的合集列表
    path_list = os.listdir('好康的东西')
    path_dict = {}
    print("--------影片清单--------")
    for i, path in enumerate(path_list, start=1):
        print(f'{i}.{path}')
        path_dict[f'{i}'] = path
    if not i:
        i = 0
    print(f'{i+1}.退出影院')
    print("-----------------------")
    choice = input('请选择要查看的合集>>>:').strip()
    if choice in path_dict:
        current_path = os.path.join('好康的东西', path_dict[choice])
        # 获取好康的影片列表
        path_list = os.listdir(current_path)
        while True:
            movie_dict = {}
            print("--------合集清单--------")
            for i, path in enumerate(path_list, start=1):
                print(f'{i}.{path}')
                movie_dict[f'{i}'] = path
            if not i:
                i = 0
            print(f'{i + 1}.退出合集')
            print("-----------------------")
            choice = input('请选择需要观看的碟片>>>:').strip()
            if choice in movie_dict:
                with open(os.path.join(current_path, movie_dict[choice]), 'r', encoding='utf8') as f:
                    print(f.read())
            elif choice == f'{i+1}':
                break
            else:
                print('李在赣神魔!看个片都看不来')
    elif choice == f'{i+1}':
        break
    else:
        print('李在赣神魔!看个片都看不来')
# 4.周末大作业(尝试编写)
# 	# 项目功能
#   	1.用户注册
#     	2.用户登录
#     	3.添加购物车
#     	4.结算购物车
# 	# 项目说明
#   		用户数据采用json格式存储到文件目录db下 一个用户一个单独的文件
#     	数据格式 {"name":"jason","pwd":123}
#        		# ps:文件名可以直接用用户名便于校验
#     	用户注册时给每个用户添加两个默认的键值对(账户余额 购物车)
#     		{"balance":15000,"shop_car":{}}
#     	添加购物车功能 商品列表可以自定义或者采用下列格式
#             good_list = [
#                     ['挂壁面',3]
#                     ['印度飞饼', 22]
#                 	['极品木瓜', 666],
#                 	['土耳其土豆', 999],
#                 	['伊拉克拌面', 1000],
#                 	['董卓戏张飞公仔', 2000],
#                 	['仿真玩偶', 10000]
#             ]
#       用户可以反复添加商品,在购物车中记录数量
#       		{'极品木瓜':[个数,单价]}
#     	结算购物车
#     		获取用户购物车中所有的商品计算总价并结算即可
# 	 针对添加购物车和结算只有登录的用户才可以执行

import os
import json

# 获取用户登录状态
login_dict = {
    'username': None
}

# 商品列表
good_list = [
    ['挂壁面', 3],
    ['印度飞饼', 22],
    ['极品木瓜', 666],
    ['土耳其土豆', 999],
    ['伊拉克拌面', 1000],
    ['董卓戏张飞公仔', 2000],
    ['仿真玩偶', 10000]
]


# 登录校验装饰器
def login_auth(func_name):
    def inner(*args, **kwargs):
        if login_dict['username']:
            res = func_name(*args, **kwargs)
            return res
        else:
            print('↓↓↓↓↓请登录↓↓↓↓↓')
            login()

    return inner


def register():
    while True:
        username = input('请输入用户名(输入q退出)>>>:').strip()
        if username == 'q':
            break
        user_list = os.listdir('db')
        if username in user_list:
            print('用户名已存在')
            continue
        password = input('请输入密码>>>:').strip()
        confirm_password = input('请确认密码>>>:').strip()
        if password != confirm_password:
            print('两次密码不一致')
            continue
        user_dict = {'username': username, 'password': password, 'balance': 150000, 'shop_car': {}}
        with open(os.path.join('db', username), 'w', encoding='utf8') as f:
            json.dump(user_dict, f)
        print(f'用户 {username} 注册成功')


def login():
    while True:
        username = input('请输入用户名(输入q退出)>>>:').strip()
        if username == 'q':
            break
        user_list = os.listdir('db')
        if username not in user_list:
            print('用户名不存在')
            continue
        password = input('请输入密码>>>:').strip()
        with open(os.path.join('db', username), 'r', encoding='utf8') as f:
            user_dict = json.load(f)
        if password == user_dict['password']:
            print(f'用户 {username} 登录成功')
            login_dict['username'] = username
            break
        else:
            print('密码错误')
            continue


@login_auth
def add_shop_car():
    with open(os.path.join('db', login_dict['username']), 'r', encoding='utf8') as f:
        user_dict = json.load(f)
    shop_car = user_dict['shop_car']
    while True:
        print("""----------------小卖铺----------------""")
        for i, good in enumerate(good_list, start=1):
            print(f"""商品编号:{i}  |  商品名称:{good[0]}  |  商品单价:{good[1]}""")
        print("""----------------小卖铺----------------""")
        choice = input('请选择想要购买的商品(输入q结束添加)>>>:').strip()
        if choice == 'q':
            user_dict['shop_car'] = shop_car
            with open(os.path.join('db', login_dict['username']), 'w', encoding='utf8') as f:
                json.dump(user_dict, f, ensure_ascii=False)
            break
        elif choice.isdigit():
            choice = int(choice)
            good_name = good_list[choice-1][0]
            good_price = good_list[choice-1][1]
            if 0 < choice <= len(good_list):
                good_count = input(f'请输入想要购买的 {good_name} 的数量>>>:').strip()
                if good_count.isdigit():
                    good_count = int(good_count)
                    if shop_car.get(good_name):
                        shop_car[good_name][0] += good_count
                        shop_car[good_name][1] += good_count * good_price
                    else:
                        shop_car[good_name] = []
                        shop_car[good_name].append(good_count)
                        shop_car[good_name].append(good_count * good_price)
                else:
                    print('请输入正确商品编号')
            else:
                print('编号商品不存在')


@login_auth
def clear_shop_car():
    with open(os.path.join('db', login_dict['username']), 'r', encoding='utf8') as f:
        user_dict = json.load(f)
    shop_car = user_dict['shop_car']
    balance = user_dict['balance']
    total_money = 0
    for good in shop_car.values():
        total_money += good[1]
    if balance < total_money:
        print('钱不够啦')
    else:
        user_dict['shop_car'] = {}
        user_dict['balance'] -= total_money
    with open(os.path.join('db', login_dict['username']), 'w', encoding='utf8') as f:
        json.dump(user_dict, f, ensure_ascii=False)
    print(f'本次消费 {total_money} 元')


func_dict = {
    '1': register,
    '2': login,
    '3': add_shop_car,
    '4': clear_shop_car
}


def run():
    while True:
        print("""
        1.注册账号
        2.登录账号
        3.添加购物车
        4.清空购物车
        5.退出系统
        """)
        choice = input('请输入想要进行的操作编号>>>:').strip()
        if choice in func_dict:
            func_dict[choice]()
        elif choice == '5':
            break
        else:
            print('李在赣神魔!')


run()

posted on 2022-07-15 18:13  祁珏  阅读(87)  评论(0)    收藏  举报

导航