内容概览
- datetime模块
- os模块
- sys模块
- json模块
一、datetime模块
和time模块相似,都是关于时间的模块
不过datetime模块把功能分成了几个类
最主要使用的有:
- time 关于时间
- date 关于日期
- datetime 关于日期与时间
- timedelta 关于时间间隔
- tzinfo 关于时区
import datetime
"""获取当前日期时间"""
t1 = datetime.datetime.today()
print(t1) # 2022-07-15 15:59:55.932242
t2 = datetime.datetime.now()
print(t2) # 2022-07-15 15:59:55.932242
# 可以单独获取指定数据
print(t1.year) # 2022
print(t1.month) # 7
print(t2.hour) # 16
print(t2.isoweekday()) # 5 以周一为一周的开始
print(t1.weekday()) # 4 以周日为一周的开始
t3 = datetime.datetime.utcnow()
print(t3) # 2022-07-15 08:13:37.420595 获得0时区的时间
"""获取当前日期"""
d1 = datetime.date.today()
print(d1) # 2022-07-15
print(d1.day) # 15
"""获取时间间隔"""
t1 = datetime.timedelta(days=3) # 获取时间差值
new_time = datetime.datetime.now()
print(new_time) # 2022-07-15 16:26:51.552999
print(new_time + t1) # 2022-07-18 16:26:51.552999
print(new_time - t1) # 2022-07-12 16:26:51.552999
# timedelta括号内参数可以设置以每周每天每时每分每秒为单位
# 可以使用元组指定日期
d1 = datetime.datetime(2022, 2, 22, 10, 10, 10)
print(d1) # 2022-02-22 10:10:10
名字 | 说明 |
---|---|
datetime.today() | 获取当前地区的日期时间 |
datetime.now() | 获取当前地区的日期时间 |
datetime.utcnow() | 获取零时区的日期时间 |
date.today() | 获取当前地区的日期 |
timedelta() | 获取指定的时间差值 |
二、os模块
os模块的操作主要是跟运行程序的操作系统相关
import os
"""创建目录"""
os.mkdir(r'a') # 只能创建单级目录
os.mkdir(r'a\b\c') # 创建多级目录会报错
os.makedirs(r'a\b\c') # 使用makedirs可以创建多级目录
os.makedirs(r'a') # 也可以创建单级目录
"""删除目录"""
os.rmdir(r'a') # 只能删除单级目录,如果目录不是空目录就会报错
os.removedirs(r'a\b\c') # 只能删除空目录,如果最下层目录删除后,上层目录也是空目录了,那么会继续删除,直到遇到不是空的目录
"""列举指定路径下的所有目录与文件"""
l1 = os.listdir()
print(l1) # 返回的结果是一个列表
l2 = os.listdir(r'D:\\') # 也可以使用绝对路径或相对路径指定目录
"""重命名目录或文件"""
os.rename(r'a', r'b') # 第一个参数是原名字,第二个参数是新名字
os.rename(r'a\aa', r'a\bb') # 如果要修改目录下的文件,新名字也需要填写目录路径,否则会移动到执行文件的目录下
"""删除文件"""
os.remove(r'f.txt')
"""获取当前工作路径(绝对路径)"""
job_path = os.getcwd()
print(job_path) # F:\pythonProject\day23
# 获取的是当前工作路径,也就是执行文件的所在的路径,所以导入的其他文件中使用到了os.getcwd,也是打印的执行文件所在的路径
"""获取文件路径"""
print(os.path.abspath(__file__)) # 获取当前文件的绝对路径
print(os.path.dirname(__file__)) # 获取当前文件的目录路径
# os.path.dirname与os.getcwd在同一个文件中获取的路径是一样的,但是模块文件使用os.path.dirname,还是返回模块文件所在的目录路径
"""判断路径是否存在"""
print(os.path.exists(r'a')) # True 判断指定路径的目录或文件是否存在
print(os.path.exists(r'a\b\c\a.txt')) # True
print(os.path.exists(r'a\c')) # Flase
print(os.path.isdir(r'a')) # True 只能判断指定的是否是目录
print(os.path.isdir(r'aaa.txt')) # False
print(os.path.isfile(r'aaa.txt')) # True 只能判断指定的是否是文件
print(os.path.isfile(r'a')) # False
"""拼接路径"""
p = os.path.dirname(__file__)
print(p) # F:\pythonProject\day23
res = os.path.join(p, 'a.txt')
print(res) # F:\pythonProject\day23\a.txt
# 因为操作系统的不同,路径分隔符也不同,使用join可以自动识别当前系统而使用正确的分隔符
"""获取文件大小"""
print(os.path.getsize(r'aaa.txt')) # 1596 使用bytes为单位
print(os.path.getsize(r'a')) # 0 不能获取目录大小
名字 | 说明 |
---|---|
mkdir() | 创建单级目录 |
makedirs() | 创建单级或多级目录 |
rmdir() | 删除一个空目录 |
removedirs() | 递归删除空目录,直到不是空目录为止 |
listdir() | 以列表形式返回当前文件目录下所有文件与目录 |
rename() | 重命名文件或目录 |
remove() | 删除文件 |
getcwd() | 获取当前工作文件目录的绝对路径 |
path.abspath() | 获取指定文件的绝对路径 |
path.dirname() | 获取指定文件目录的绝对路径 |
path.exists() | 判断指定文件或目录是否存在 |
path.isdir() | 判断指定目录是否存在 |
path.isfile() | 判断指定文件是否存在 |
path.getsize() | 获取文件大小 |
三、sys模块
sys模块的操作主要和python解释器相关
import sys
print(sys.path) # 返回查询模块路径的列表
print(sys.version) # 返回当前解释器信息
print(sys.platform) # 查询当前的操作系统
"""argv"""
# 使用argv需要以命令行执行当前文件,执行文件时使用空格追加数据值,argv的返回值是列表,列表第一个值是文件名
# 使用异常捕获实现登录功能
res = sys.argv
'''需求 命令行执行当前文件必须要提供用户名和密码 否则不准执行'''
try:
username = res[1]
password = res[2]
except IndexError as e:
print('需要输入用户名和密码')
else:
if username == 'jason' and password == '123':
print('您可以执行该文件')
else:
print('用户名或密码错误')
名字 | 说明 |
---|---|
path | 以列表返回查询模块路径 |
version | 返回当前解释器信息 |
platform | 查询当前的操作系统 |
argv | 使命令行带参数运行 |
四、json模块
json模块也被称为序列化模块
json模块是不同编程语言相互传递数据必备的模块
计算机传递数据肯定是使用二进制,在python中能转换二进制就只有使用字符串的encode方法
所以json格式的数据也是字符串
json格式的数据特征:1.字符串 2.双引号
import json
user_dict = {'name': 'jason', 'pwd': 123}
"""如果希望将字典存入文件,取出来是仍然是一个字典,正常使用文件读写不是那么容易做到"""
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write(str(user_dict)) # 因为文件只能写入文本,所以需要转换成字符串格式
with open(r'a.txt', 'r', encoding='utf8') as f:
res = f.read()
print(res, type(res)) # 读取出来也是字符串格式,而且不能强制转换成字典
"""这时就可以先转换成json格式字符串"""
res = json.dumps(user_dict) # 序列化
print(res, type(res)) # {"name": "jason", "pwd": 123} <class 'str'>
res1 = json.loads(res) # 反序列化
print(res1, type(res1)) # {'name': 'jason', 'pwd': 123} <class 'dict'>
"""现在就可以使用转换成json格式的字符串写入文件,而且json还提供了一种更方便的转换格式写入文件的方法"""
with open(r'a.txt', 'w', encoding='utf8') as f:
json.dump(user_dict, f) # 将第一个数据序列化并写入文件
with open(r'a.txt', 'r', encoding='utf8') as f:
res = json.load(f) # 读取文件中一段数据并反序列化
print(res) # {'name': 'jason', 'pwd': 123} <class 'dict'>
名字 | 说明 |
---|---|
dumps() | 将其他数据类型转换成json格式字符串 |
dump() | 将其他数据类型转换成json格式写入文件 |
loads() | 将json格式字符串转换成对应的数据类型 |
load() | 将文件中的json格式字符串读取出来并转换成对应数据类型 |
五、练习
"""
1.编写一个统计指定文件类型的脚本工具
输入指定类型的文件后缀
eg:.txt
并给出一个具体路径 之后统计该类型文件在该文件下的个数
ps:简单实现即可 无需优化
"""
count_type = input('输入统计文件类型:').strip()
count_path = input('统计路径:').strip()
try:
os.chdir(count_path) # 如果文件路径不存在会报错,使用try捕获
except FileNotFoundError:
print('文件路径有误')
else:
dir_list = os.listdir()
count_num = 0
for i in dir_list:
file_suf = i.split('.')[-1]
if count_type == file_suf:
count_num += 1
print(count_num)
"""
2.针对json实操 尝试单文件多用户(一行一个)是否可实现 哪个更方便
"""
user_info_path = os.path.abspath(r'db')
def regist():
username = input('username>>>:').strip()
password = input('password>>>:').strip()
with open(rf'{user_info_path}\user_info', 'r+', encoding='utf8') as f:
for line in f:
user = json.loads(line)
if username == user.get('name'):
break
else:
new_user = {'name': username, 'pwd': password}
json.dump(new_user, f)
f.write('\n')
def log_in():
username = input('username>>>:').strip()
password = input('password>>>:').strip()
with open(rf'{user_info_path}\user_info', 'r+', encoding='utf8') as f:
for line in f:
user = json.loads(line)
if username == user['name'] and password == user['pwd']:
print('登录成功')
break
else:
print('用户名或密码错误')
regist()
log_in()
"""
3.编程小练习
有一个目录文件下面有一堆文本文件
eg:
db目录
J老师视频合集
R老师视频合集
C老师视频合集
B老师视频合集
文件内容自定义即可 要求循环打印出db目录下所有的文件名称让用户选择
用户选择哪个文件就自动打开该文件并展示内容
涉及到文件路径全部使用代码自动生成 不准直接拷贝当前计算机固定路径
"""
# l1 = ['J', 'R', 'C', 'B']
# for i in l1:
# os.mkdir(rf'db\{i}')
# for l in range(10):
# with open(rf'db\{i}\{l}.txt', 'w'):
# pass
while True:
db_path = os.path.join(os.path.dirname(__file__), 'db') # 先拼接获取db目录路径
db_file = os.listdir(db_path) # 获取目录里所有文件和目录
for i in db_file:
print(i) # 循环打印
choce_dir = input('请输入想要打开的文件夹:').strip()
inner_path = os.path.join(db_path, choce_dir) # 拼接路径
if not os.path.exists(inner_path): # 判断路径文件是否存在
print('目录不存在')
break
for i in os.listdir(inner_path):
print(i)
choce_file = input('请输入想要打开的文件:').strip()
file_path = os.path.join(inner_path, choce_file) # 拼接路径
if not os.path.exists(file_path): # 判断文件是否存在
print('文件不存在')
break
with open(rf'{file_path}', 'r', encoding='utf8') as f:
for line in f:
print(line.strip()) # 打印每行内容
break