【修仙】第一卷 初出茅庐 第二十三章 模块3
目录
前情提要
模块的绝对导入与相对导入
绝对导入
始终以当前执行文件的sys.path为基准
ps:项目根目录最好自己再添加一遍
相对导入
模块文件之间的导入会使用到相对导入
但绝对导入更好
| 标点 | 作用 |
|---|---|
| . | 当前文件路径 |
| .. | 上一级文件路径 |
| ../.. | 上上级文件路径 |
包的概念
本质
就是存储多个py文件的文件夹

目的
方便管理
语句
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()
浙公网安备 33010602011771号