目录

一、模块的绝对导入和相对导入

​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'

时间模块之datatime模块、os模块、sys模块、json模块、json模块实操-LMLPHP

时间模块之datatime模块、os模块、sys模块、json模块、json模块实操-LMLPHP

2.os.makedirs()

  • 创建多级目录 也可以创建单级目录
os.makedirs(r'bbb\ccc\ddd')
os.makedirs(r'ccc')

时间模块之datatime模块、os模块、sys模块、json模块、json模块实操-LMLPHP

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)
07-15 21:16