一、模块的绝对导入和相对导入
1.绝对导入:以执行文件所在的sys.path为起始路劲,然后一层一层向下找,如果不是用pycharm运行就会报错,则需要将项目根目录添加到sys.path
2.相对导入:以当前模板文件路径为准,只能在模板文件中使用,不能在执行文件中使用,相对导入在项目中比较复杂的情况下可能会报错,所以不推荐使用
二、包的概念
1.概念:内部含有双下init.py的文件夹
2.作用:为了更加方便的管理模块文件
3.使用:导入包名其实导入的是里面的__
init__
.py文件,通过相对导入将其他模块导入__
init__
.py文件中,然后在执行文件中通过点的方式使用模块里的名字,也可以使用绝对路径直接跨过__
init__
.py直接导入包里面的模块文件
三、编程思想的转变
小白阶段---->函数阶段---->模块阶段
不断地变化进步目的是为了更加方便快捷高效的管理资源
四、软件开发目录规范
根据我们的需求,高效的管理资源,分模块文件多了之后还需要有文件夹
bin文件夹:用于存储程序的启动文件
conf文件夹:用于存储程序的配置文件
core文件夹:用于存储程序的核心逻辑,程序的功能
lib文件夹:用于存储程序的公共功能
db文件夹:用于存储程序的数据文件
log文件夹:用于存储日志文件
interface文件夹:用于存储一些接口文件
readme文本文件:类似于说明书
requirements.txt文件:用于存储程序所需的第三方模块名称和版本
五、常见的内置模块
1.collections模块
namedtuple(具名元组)、deque(双端列表)、orderdict(有序字典)、defaultdict(默认值字典)、counter(计数器)
2.time模块
时间戳 time.time()、结构化时间 time.gmtime()、格式化时间 time.strftime()
struct_time通过 strftime 转变为Format string
Format string通过 strptime 转变为struct_time
struct_time通过 mktime 转变为Timestamp
Timestamp通过 localtime gmtime 转变为struct_time
<center><font size=30px color=LightSeaGreen>今日学习内容</font></center>
一、时间模块之datatime模块
1.datetime.datetime.today()
表示的是当前的时间 年月日时分秒 秒数精确到了后6位
import datetime
res = datetime.datetime.today() # 2022-07-15 15:28:26.400621
print(res)
2.datetime.date.today()
表示的是当前的时间 年月日
import datetime
res1 = datetime.date.today() # 2022-07-15
print(res1)
ps:想区分这俩个结果,就看中间的是datetime还是date,中间的是datetime那么结果就是年月日时分秒,中间的是date那么结果就是年月日
3.datetime.date.today()
时间差值,可以对时间进行换算,有以下参数 如果没有的话可以通过已有的进行换算,已有的如下:
days: float = ..., days: float = ..., microseconds: float = ..., milliseconds: float = ..., minutes: float = ..., hours: float = ..., weeks: float = ...。
res1 = datetime.date.today() # 2022-07-15
t1 = datetime.timedelta(days=3)
print(res1 + t1) # 2022-07-18
print(res1 - t1) # 2022-07-12
4.datetime.datetime.now()(不常用)
表示的是当前时间,与datetime.datetime.today()这个重复
print(datetime.datetime.now()) # 2022-07-15 16:05:17.480020
5.通过点的方式只取年或者月或者日等内置方法
import datetime
res = datetime.datetime.today()
print(res) # 2022-07-15 16:09:51.276748
print(res.day) # 15
print(res.year) # 2022
print(res.month) # 7
print(res.hour) # 16
print(res.minute) # 11
print(res.weekday()) # 4
print(res.isoweekday()) # 5
二、os模块
os模块是与操作系统交互的一个接口
1.os.mkdir
生成单级目录,如果目录存在的话就会报错,提示该文件夹已经存在不能再次创建
不能创建多级目录
import os
os.mkdir(r'aaa') # 创建了新的文件夹
os.mkdir(r'aaa') # 第二次创建的时候 FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'aaa'
os.mkdir(r'bbb\ccc\ddd') # FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'bbb\\ccc\\ddd'
2.os.makedirs()
- 创建多级目录 也可以创建单级目录
os.makedirs(r'bbb\ccc\ddd')
os.makedirs(r'ccc')
3.os.rmdir()
- 可删除单级目录,但是这个目录下面什么都没有才可以被删除,也不可以删除多级空目录
os.rmdir(r'aaa')
4.os.removedirs()
对有数据的目录不可以进行删除
在多级目录的情况下删除的时候是从最底下的开始,然后一层一层向上检查,如果到了那层有数据的时候,就不会删除了,没有的话就一层一层的进行删除
os.removedirs(r'bbb')
os.removedirs(r'bbb\ccc\ddd')
5.os.listdir()
- 列出当前目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
- 可以进行指定目录查看目录下面所有文件和子目录包括隐藏文件,并以列表方式打印
print(os.listdir()) # ['.idea', '01 时间模块.py', '02 os模块.py']
print(os.listdir(r'D:\\')) # ['$RECYCLE.BIN', 'BaiduNetdisk', 'BaiduNetdiskDownload', 'EVcapture', 'iQIYI', 'Notedpad++', 'PyCharm 2021.1.3', 'python27', 'Python38', 'pythonProject', 'PythonStudyContent', 'PythonsVideo', 'QQMusicCache', 'qycache', 'System Volume Information', 'Tencent', 'Typora', 'YouDao', '声卡']
6.os.rename()
- 对文件进行修改名字
print(os.rename(r'a.txt', r'aaa.txt'))
7.os.remove()
- 删除文件
print(os.remove(r'aaa.txt'))
8.os.getcwd()
- 获取当前工作路径,绝对路径
print(os.getcwd()) # D:\pythonProject\day24
9.os.chdir()
- 切换路径
print(os.getcwd()) # D:\pythonProject\day24
os.chdir(r'..')
print(os.getcwd()) # D:\pythonProject
10.os.path.abspath(__
file__
)(支持嵌套)
- 与程序启动文件相关
- 当前项目如果放在其他计算机上,原来的绝对路径可能会发生变化,没有办法确定项目文件所在的绝对路径
- 如何怎加程序的兼容性? 使用os.path.dirname(os.path.dirname(file)) 嵌套可以提升层级
print(os.path.abspath(__file__)) # D:\pythonProject\day24\02 os模块.py 获取的是当前文件的绝对路径
print(os.path.dirname(__file__)) # D:/pythonProject/day24 获取的是当前文件所在的目录路径
import sys
sys.path.append(r'D:\pythonProject\day24\ATM')
# 这里的绝对路径换太电脑是没有办法确定它在哪
from core import src
src.run()
# 如何怎加程序的兼容性
res = os.path.dirname(__file__) # D:/pythonProject/day24/ATM/bin
res1 = os.path.dirname(os.path.dirname(__file__)) # D:/pythonProject/day24/ATM
sys.path.append(res1)
# 嵌套可以提升层级,嵌套一次提升一层,再嵌套一次又提升一层
11.os.path.exists()、os.path.isdir()、os.path.isfile()
- os.path.exists()前者判断路径是否存在 可以是文件可以是目录,os.path.isdir()只适用于路径是否为文件夹,os.path.isfile()只适用于路径是否文件
- 返回的是布尔值
print(os.path.exists(r'ATM')) # True
print(os.path.exists(r'bbb')) # False
print(os.path.exists(r'01 时间模块.py')) # True
print(os.path.isdir(r'ATM')) # True
print(os.path.isfile('01 时间模块.py')) # True
12.os.path.join(path1[, path2[, ...]])
- 将多个路径拼接后返回,第一个绝对路径之前的参数将被忽略
- 涉及到路径拼接不要使用 + ,建议使用os模块里的join方法,不同的操作系统路径分隔符不一样,如果使用的是‘\’,那就只能在windows系统下使用了,join会自动识别当前在什么系统下操作的,然后给予对应的分隔符
- windows---\,mac---/
relative_path = 'a.txt'
absolute_path = r'D:\pythonProject\day24\ATM\core'
'''拼接a.txt的绝对路劲'''
res = os.path.join(absolute_path, relative_path)
print(res) # D:\pythonProject\day24\ATM\core\a.txt
13.os.path.getsize(path)
- 获取文件大小
- 以bytes为单位
print(os.path.getsize(r'01 时间模块.py')) # 746
三、sys模块
与os模块可以称之为兄弟模块,sys模块主要是跟python解释器打交道
1.sys.path
- 当前执行文件所在的系统变量,结果是列表
import sys
print(sys.path) # ['D:\\pythonProject\\day24', 'D:\\pythonProject\\day24', 'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_display', 'D:\\Python38\\python38.zip', 'D:\\Python38\\DLLs', 'D:\\Python38\\lib', 'D:\\Python38', 'D:\\Python38\\lib\\site-packages', 'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
2.sys.version(了解)
import sys
print(sys.version) # 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)]
3.sys.platform(了解)
import sys
print(sys.platform) # win32
4.sys.argv
- 命令行参数List,第一个元素是程序本身路径
res = sys.argv
if len(res) == 3:
username = res[1]
password = res[2]
if username == 'zhang' and password == '123':
print('您可以正在执行该文件')
else:
print('用户名或密码错误')
else:
print('请填写用户名和密码')
四、json模块
- json模块也称之为序列化模块,是不同编程语言之间数据交互必备的模块
- 不同编程语言之间数据类型存在差异,无法直接交互
- json模块相当于是一个中间人,作为不同的编程语言之间数据类型先来到json这里进行转为为对方可是识别的数据类型然后再交给它
1.json格式的数据应该是什么?
由于数据基于网络传输肯定是二进制,那么在python中只有字符串可以调用encode方法转成二进制数据,所以json格式的数据也是字符串
2.json格式的数据的特征是?
首先肯定是一个字符串 其次引号是标志性的双引号
import json
d = {'name': 'jason', 'pwd': 123}
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'>
例题展示
# 方式一:使用json.dump(d, f),es = json.load(f)
import json
d = {'name': 'jason', 'pwd': 123}
with open(r'b.txt', 'w', encoding='utf8') as f:
json.dump(d, f) # 直接让字典写入文件(json自动帮你完成转换)
with open(r'b.txt', 'r', encoding='utf8') as f:
res = json.load(f)
print(res, type(res))
# 方式二: 使用f.write(json.dumps(d)),res = json.loads(data)
import json
d = {'name': 'jason', 'pwd': 123}
with open(r'b.txt', 'w', encoding='utf8') as f:
f.write(json.dumps(d))
with open(r'b.txt', 'r', encoding='utf8') as f:
data = f.read()
res = json.loads(data)
print(res, type(res))
小结
dumps() 将其他数据类型转换成json格式字符串
loads() 将json格式字符串转化成对应的数据类型
dump() 将其他数据数据以json格式字符串写入文件
load() 将文件中json格式字符串读取出来并转换成对应的数据类型
实现的需求是:不需要以拼接为字符串的形式去存储数据,用的时候又得需要进行切割,使用json模块后,可以直接存储数据,然后使用的时候直接拿出来.get就可以使用
五、json模块实操
涉及到用户数据的存储 可以单用户单文件
1.涉及到用户数据的存储 可以单用户单文件
jason.json
kevin.json
oscar.json
import json
import os
# 3.拼接用户名文件对应的绝对路径,用来打开文件,先把路径存一下
base_dir = r'D:\pythonProject\day24\db'
# 1.获取用户的输入
username = input('username:').strip()
# 4.获取路径下面所有的文件名,这里获取到的是用户的用户名
username_list = os.listdir(base_dir)
# 2.判断用户名是否存在
if username in username_list:
# 5.拼接文件的路径,某一个文件的完整路径
file_path = os.path.join(base_dir, username)
# 6.打开文件读取文件
with open(file_path, 'r', encoding='utf8') as f:
data = json.load(f)
print(data, type(data))
# print(os.listdir(r'D:\pythonProject\day24\db'))
# 专门放置一个文件夹用来存放用户的数据
# base_dir = os.path.dirname(__file__)
# db_path = os.path.join(base_dir,'db')
# 判断路径在不在 如果路径不存在就会创建
# if not os.path.exists(db_path):
# os.mkdir(db_path)
# username = input('username>>>:').strip()
# password = input('password>>>:').strip()
# user_dict = {'username': username,
# 'password': password,
# 'balance': 15000,
# 'shop_car':[]
# }
# 将名字拼接起来,相当于在db下存储文件,join是用来拼接文件路径的
# file_path = os.path.join(db_path, '%s'%username)
# 不要文件的后缀会变得更简单,用listdir的时候获取到的就是数据名,判断用户名是否存在的时候,如果有的话将绝对路径拼出来,就可以拿到用户的数据了
# file_path = os.path.join(db_path, '%s.json'%username)
# with open(file_path,'w',encoding='utf8') as f:
# json.dump(user_dict, f)