python-模块(3)

内容概览

  • datetime模块
  • os模块
  • sys模块
  • json模块

一、datetime模块

和time模块相似,都是关于时间的模块
不过datetime模块把功能分成了几个类
最主要使用的有:

  1. time 关于时间
  2. date 关于日期
  3. datetime 关于日期与时间
  4. timedelta 关于时间间隔
  5. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值