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


    昨日内容回顾

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

    ​ 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

    今日学习内容

    一、时间模块之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'
    

    image-20220715163205047

    image-20220715163745364

    2.os.makedirs()

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

    image-20220715164031815

    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} 
    res1 = json.loads(res)  # 反序列化:将json格式字符串转换成对应编程语言中的数据类型
    print(res1, type(res1))  # {'name': 'jason', 'pwd': 123} 
    
    • 例题展示

    # 方式一:使用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)
    
    折叠
  • 相关阅读:
    SpringBoot网课管理系统的设计与实现源码
    i5 6500 HD530 台式机黑苹果记录
    EventBus3.0源码分析(三)
    494. 目标和
    Python复习知识点(一)
    Spring初始(相关基础知识和概述)
    【Pytorch深度学习开发实践学习】Pytorch实现LeNet神经网络(3)predict.py
    算法 | 算法是什么?深入精讲
    代码大全2读书笔记【6-8章】
    在英文电脑系统中,中文显示??????
  • 原文地址:https://www.cnblogs.com/zxr1002/p/16482812.html