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

一、时间模块之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.dirname(__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)

六、作业

1.编写一个统计指定文件类型的脚本工具

# 	输入指定类型的文件后缀
#     	eg:.txt
# 	并给出一个具体路径 之后统计该类型文件在该文件下的个数
#  	ps:简单实现即可 无需优化
#
import os

# 1.输入指定类型的文件后缀
file_name = input('请输入想要统计的文件后缀名:')
# 2.给出一个具体路径
# 2.1获取当前文件所在的目录路径
file_path = os.path.dirname(__file__)
# 2.1列出当前目录下的所有文件和子目录
file_list = os.listdir(file_path)
# 4.定义一个计数器
count = 0
# 3.循环
for i in file_list:
    file_all = os.path.join(file_path, i)
      # 判断尾部元素
    if file_all.endswith(file_name):
        count += 1
print(count)

3.编程小练习:有一个目录文件下面有一堆文本文件,文件内容自定义即可 要求循环打印出db目录下所有的文件名称让用户选择,用户选择哪个文件就自动打开该文件并展示内容,涉及到文件路径全部使用代码自动生成 不准直接拷贝当前计算机固定路径

# 3.编程小练习
# 	有一个目录文件下面有一堆文本文件
#     	eg:
#     		db目录
#             J老师视频合集
#             R老师视频合集
#             C老师视频合集
#             B老师视频合集
# 	文件内容自定义即可 要求循环打印出db目录下所有的文件名称让用户选择
#  	用户选择哪个文件就自动打开该文件并展示内容
#  	涉及到文件路径全部使用代码自动生成 不准直接拷贝当前计算机固定路径

# 创建文件
# os.makedirs(r'db\J')
# os.makedirs(r'db\R')
# os.makedirs(r'db\C')
# os.makedirs(r'db\B')
# 获取当前文件目录
# 1.获取当前路径,然后拼接数据文件
file_name = os.path.join(os.path.dirname(__file__), "db")
# print(file_name)
# 2.获取该路径下所有的文件
file_list = os.listdir(file_name)
# print(file_list)
# 3.循环打印出db目录下所有的文件名称
for i in file_list:
    print(f'''
        {i}:{i}老师视频合集
    ''')
# 4.获取用户输入的文件名
user_choice = input('请输入你要打开的文件夹:')
# 5.将要开的的文件与原本的文件进行拼接进行拼接
choice_file_name = os.path.join(file_name, f'{user_choice}')
print(os.listdir(choice_file_name))
posted @ 2022-07-15 21:14  张张包~  阅读(149)  评论(0编辑  收藏  举报