常见的内置模块
今日内容
- collections模块
- time模块
- datetiem模块
- sys模块
- os模块
- json模块
- 作业
内置模块就是python解释器已经编写好的我们可以直接使用它的功能非常的方便
collectinos模块
我们之前学基本数据类型只有八大类(整型、浮点型、字符串、列表、字典、元祖、集合、布尔值)
现在collectinons模块又为我们提供了更多的数据类型
1.1 namedtuple(具名元祖)
1 from collections import namedtuple 2 point = namedtuple('坐标', ['x', 'y']) 3 res1 = point(11, 22) 4 res2 = point(55, 66) 5 print(res1, res2) # 坐标(x=11, y=22) 坐标(x=55, y=66) 6 7 # 也可以不用列表直接使用字符串还可以传三个参数 8 point = namedtuple('坐标', 'x y z') 9 res1 = point(11, 22, 33) 10 res2 = point(55, 66, 77) 11 print(res1, res2) # 坐标(x=11, y=22, z=33) 坐标(x=55, y=66, z=77)
1.2 deque(双端队列)
我们之前所说的队列就是存放数据的时候 先进先出
而双端队列就是可以两边都可以进
1 from collections import deque 2 3 q = deque() 4 q.append(11) 5 q.append(22) 6 q.append(33) 7 q.append(44) 8 print(q) # deque([11, 22, 33, 44]) 9 # 我们还可以在q的左边添加数据值 10 q.appendleft(555) 11 print(q) # deque([555, 11, 22, 33, 44])
1.3 OrderedDict(有序字典)
我们之前所了解的字典都是无序的而现在给我们提供了一个有序字典
from collections import OrderedDict d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) # {'a': 1, 'c': 3, 'b': 2} 是无序的 但是我们可以把它变成有序的 d1 = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(d1) # OrderedDict([('a', 1), ('b', 2), ('c', 3)]) # 注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序
1.4 defaultdict
# 快速生成字典 d = defaultdict(k1=[], k2=[]) print(d) # defaultdict(None, {'k1': [], 'k2': []})
1.5 Counter(计数器)
from collections import Counter # 现在有一个很乱的字符串 现在要计算里面每个字符的个数 # 组织成 {'字符':个数, '字符2':个数} s = 'dahujdhawuiohdio' # 最开始我们可以使用for循环解决 d = {} for i in s: if i in d: d[i] += 1 else: d[i] = 1 print(d) # {'d': 3, 'a': 2, 'h': 3, 'u': 2, 'j': 1, 'w': 1, 'i': 2, 'o': 2} # 不过我们现在可以使用计数器来计算 s = 'dahujdhawuiohdio' res = Counter(s) print(res) # Counter({'d': 3, 'h': 3, 'a': 2, 'u': 2, 'i': 2, 'o': 2, 'j': 1, 'w': 1}) # 这样会方便许多# 只要是能够被for循环的都可以当做参数传入Counter然后计算
time模块
时间的三种模式
1.时间戳 time.time()
2.结构化时间 time.gmtime()
3.格式化时间 time.strftime()
1.1 时间戳
就是从1970年0时0分0秒开始到现在总共多少秒了, 运行print(time.time()) 返回的是float类型
1.2结构化时间
就是计算机看的懂的时间有九大元素
1.3 格式化时间
就是人类看的舒服的时间 2022-07-14 17:08:36
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(0-12)
%M 分钟数(0-59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示(e.g Thu Dec 10 09:54:27 2020)
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示(e.g 12/10/20)
%X 本地相应的时间表示(e.g 09:58:15)
%Z 当前时区的名称(e.g 中国标准时间)
%% %号本身
其中最主要的就是 %Y %m %d %H %M %S %X
import time print(time.time()) # 1657789972.6291883 print(time.gmtime()) # time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=9, tm_min=12, tm_sec=13, tm_wday=3, tm_yday=195, tm_isdst=0) print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2022-07-14 17:12:13 print(time.strftime('%Y-%m-%d %X')) # 2022-07-14 17:12:13 # 时间获取的是当前运行文件时的时间
1.4 三者的互相转换
1.4.1 时间戳转结构化时间
1 # time.gmtime(时间戳) # UTC时间 与英国伦敦当地时间一致 2 # time.localtime(时间戳) # 当地时间例如我们现在在北京执行这个方法:与UTC时间相差8小时 UTC时间+8小时 = 北京时间 3 print(time.gmtime(1657789972)) 4 # time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=9, tm_min=12, tm_sec=52, tm_wday=3, tm_yday=195, tm_isdst=0) 5 print(time.localtime(1657789972)) 6 # time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=17, tm_min=12, tm_sec=52, tm_wday=3, tm_yday=195, tm_isdst=0)
1.4.2 结构化时间转时间戳
1 # 结构化时间转时间戳 2 # time.mktime(结构化时间) 3 time_tuple = time.localtime(1657789972) 4 print(time.mktime(time_tuple)) # 1657789972.0
1.4.3 格式化时间转结构化时间
1 print(time.strptime('2022-07-14 17:12:13', '%Y-%m-%d %H:%M:%S')) 2 time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=17, tm_min=12, tm_sec=13, tm_wday=3, tm_yday=195, tm_isdst=-1)
1.4.4 结构化时间转格式化时间
print(time.strftime('%Y-%m-%d %X')) # 2022-07-14 17:22:07 print(time.strftime("%Y-%m-%d", time.localtime(1657789972))) # 2022-07-14
datetime模块
与时间模块一样都是对时间继续相关操作
datetime模块里最主要的两个功能就是datetime.tody和date.tody
1 import datetime 2 3 res = datetime.datetime.today() 4 print(res) # 2022-07-15 17:11:55.376975 可以把描述精确到六位 5 6 res1 = datetime.date.today() 7 print(res1) # 2022-07-15 这个只显示年月份 # 还可以单独拿时间的关键字 print(res.year) # 2022 print(res.month) # 7 print(res.weekday()) # 4 print(res.isoweekday()) # 5 8 ''' 9 如果中间的英文是date 那么显示的就是年月日 10 如果中间的英文是datetime 那么显示的就是年月日 时分秒 11 '''
timedelta()
时间差值 给他一个参数就可以有一个时间数
import datetime res1 = datetime.date.today() res2 = datetime.timedelta(days=3) print(res1) # 2022-07-15 print(res1 + res2) # 2022-07-18 ''' 他还有很多单位: days, seconds, microseconds, milliseconds, minutes, hours, weeks 如果是其他的单位可以通过换算来达到 ''' 补充知识 : import datetime print(datetime.datetime.utcnow()) # 2022-07-15 10:51:26.211439 零时区的时间 print(datetime.datetime.now()) # 2022-07-15 18:51:26.227397 当前时区的时间 c =datetime.datetime(2022, 7, 15, 19, 00) print('指定日期:', c) # 指定日期: 2022-07-15 19:00:00 还可以自己编写时间
os模块
os模块主要跟当前程序的操作系统打交道
文件夹就是一个目录
1.创建目录
import os os.mkdir(r'aaa') # 就是创建一个单级目录 因为这是一个相对路径所以这个文件夹在项目的根目录下 os.makedirs(r'aaa\bbb\ccc') # 就是创建一个多级目录 也因为是一个相对路径所以创建的文件夹在项目的根目录下 # 多级目录还可以只创建一个单级目录 os.makedirs(r'eee') # 但是mkdir不能创建多级目录 os.mkdir(r'aaa\bbb\ccc') # 报错
2.删除目录
import os os.rmdir(r'eee') # 能够删除单级目录 # 单级目录下不能有数据要不然删除不掉 而且多级目录也删除不掉 # 文件夹a下有一个b.txt os.rmdir(r'a') # 会报错 因为文件夹a下有一个文本文件b.txt 所以删除不掉 os.rmdir(r'aaa\bbb\ccc') # 也会报错 因为多级文件也删除不掉 只能删除单级文件并且文件夹下还必须没有文件的才可以 os.removedirs(r'aaa') # 文件夹下如果有文件也是删除不掉的 os.removedirs(r'aaa\bbb\ccc') # 由内而外逐一删除 直到有数据的文件夹为止
3.列举文件指定路径下的所有文件名称
import os res = os.listdir(r'D:\MYpycharm\day21') print(res) # ['.idea', '11.py', 'a', 'db'] # 结果是一个列表 print(os.listdir(r'D://')) # D盘也是可以查看的
4.重命名文件 删除文件
import os os.rename(r'a.txt', 'bbb.txt') # 前面是老的文件名 后面是新的文件名 os.remove(r'bbb.txt') # 这样就可以删除文件了
5.获取当前工作路径
import os print(os.getcwd()) # D:\MYpycharm\day21 获取当前工作路径(绝对路径) os.chdir('..') # 切换路径 print(os.getcwd()) # D:\MYpycharm
6.与程序启动文件相关
import os print(os.path.abspath(__file__)) # D:\MYpycharm\day21\11.py 获取当前文件所在的绝对路径 print(os.path.dirname(__file__)) # D:/MYpycharm/day21 获取当前文件的根目录的绝对路径
7.判断路径是否存在(目录 文件)
import os print(os.path.exists(r'db')) # True 判断当前根目录下是否存在指定的文件夹 print(os.path.exists(r'ATM')) # False print(os.path.exists(r'aaa.txt')) # True 文件也可以 print(os.path.exists(r'jason.json')) # False 没有就返回False print(os.path.isfile(r'db')) # False 专门判断是否有没有指定的文件 db是一个文件夹所以是False print(os.path.isfile(r'aaa.txt')) # True print(os.path.isdir(r'aaa.txt')) #False 专门判断是否有没有指定的文件夹 aaa.txt是一个文件所以是False print(os.path.isdir('db')) # True
8.拼接路径
import os relative_path = 'a.txt' absolute_path = r'D:\MYpycharm\day21' # file_path = absolute_path + relative_path # print(file_path) # D:\MYpycharm\day21\\a.txt """ 涉及到文件的拼接的时候不要使用+号拼接 建议使用os模块中的join方法 """ print(os.path.join(absolute_path, relative_path)) # D:\MYpycharm\day21\a.txt # join方法可以自动识别当前所在的操作系统并自动切换正确的分隔符 windows:\ mac:/
9.获取文件的大小
import os print(os.path.getsize(r'aaa.txt')) # 获取的单位是bytes
sys模块
sys模块主要跟python解释器打交道
import sys print(sys.path) r''' 相当于是程序的环境变量 只要模块的路径在里面就可以使用该模块 [ 'D:\\MYpycharm\\day21', 'D:\\MYpycharm\\day21', 'D:\\PyCharm 2022.1.2\\plugins\\python\\helpers\\pycharm_display', 'D:\\python3.6\\python36.zip', 'D:\\python3.6\\DLLs', 'D:\\python3.6\\lib', 'D:\\python3.6', 'D:\\python3.6\\lib\\site-packages', 'D:\\PyCharm 2022.1.2\\plugins\\python\\helpers\\pycharm_matplotlib_backend' ] ''' print(sys.version) # 查看当前python解释器的版本 # 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)] print(sys.platform) # 查看当前操作平台信息 # win32 res = sys.argv # ['D:/MYpycharm/day21/11.py'] if len(res) == 3: username = res[1] password = res[2] if username == 'jason' and password == '123': print('您可以正在执行该文件') else: print('用户名或密码错误') else: print('请填写用户名和密码 二者不可或缺') # 不过一定要在终端模式下运行 print(res) ''' 打印的是一个路径这个是在终端命令下才会显示出效果 在pycharm左下方可以点击Terminal就可以进入终端窗口 当切入到 python3 "11.py"这个路径时就会执行11.py这个文件 结果为: ['11.py'] 还可以在后面加上两个参数python "11.py" jason 123 就会添加到列表中 ['11.py', 'jason', '123'] 这样我们就可以使用用户和密码判断是否是jason如果是在运行 '''
json模块
json模块又称之为序列化模块
json模块时不同编程语言之间数据交互必备的模块(处理措施)
1.json格式的数据应该是什么
两个编程语言互相交互数据是通过网络传输数据的
而基于网络传输数据的单位都是二进制 那么在python中只有字符串可以通过调用encode方法转成二进制数
所以json格式数据也属于字符串
2.json格式数据的特征
json数据有一个很明显的特征
首先他是一个字符串 然后引号肯定是一个双引号
d = {'name': 'jason', 'pwd': 123}
# 需求:将上述字典保存到文件中 并且将来读取出来之后还是字典
d = {'name': 'jason', 'pwd': 123} # 需求:将上述字典保存到文件中 并且将来读取出来之后还是字典 with open(r'b.txt', 'w', encoding='utf8') as f: f.write(str(d)) with open(r'b.txt', 'r', encoding='utf8') as f: data = f.read() print(data, type(data)) # {'name': 'jason', 'pwd': 123} <class 'str'> # 像这样直接使用str转换的话提取出来的时候还是一个字符串那么我们就不能对原来的字典进行操作了
我们可以使用json模块把其他数据类型转换成json格式的数据类型继续保存
然后在通过json模块给转回原来的数据数据类型继续提取
import json res = json.dumps(d) # 序列化 将其他数据类型转换成json格式字符串 print(res, type(res)) # # {"name": "jason", "pwd": 123} <class 'str'>这个时候字典就被转换成json格式的数据 d1 = {"name": "jason", "pwd": 123} print(d1) # {'name': 'jason', 'pwd': 123} 而我们自己打的双引号最后显示的还是一个单引号就是普通的字符串 res1 = json.loads(res) # 反序列化 将json格式字符串转换成对应编程语言中的数据类型 print(res1, type(res1)) # {'name': 'jason', 'pwd': 123} <class 'dict'> # 这样我们就可以把json数据转回原来的数据类型
import json with open(r'b.txt', 'w', encoding='utf8') as f: # f.write(json.dumps(d)) 这个dumps就是先转换成json数据然后在写入文件 json.dump(d, f) # 我们可以直接使用dump 直接让字典写入文件(json自动帮你完成转换) with open(r'b.txt', 'r', encoding='utf8') as f: # data = f.read() # res = json.loads(data) # 这个是先转换原来的数据类型 然后在赋值 # print(res, type(res)) res = json.load(f) # 也是自动装换成原来的数据直接赋值 print(res, type(res))
3.dumps与dump lords与lord的区别
''' dumps() 将其他数据类型转换成json格式字符串 lords() 将json格式字符串转换成对应的数据类型 dump() 将其他数据类型转成json格式字符串然后写入文件 lord() 将json格式字符串读取出来然后转换成对应的数据类型 '''
作业
1. 编写一个统计指定文件类型的脚本工具
# 输入指定类型的文件后缀 # eg:.txt # 并给出一个具体路径 之后统计该类型文件在该文件下的个数 # ps:简单实现即可 无需优化 import os user_suffix = input('请输入您要统计的后缀名>>>:').strip() base_dir = os.path.dirname(__file__) bd_dir = os.path.join(base_dir, 'db') if not os.path.exists(bd_dir): os.mkdir(bd_dir) list_dir = os.listdir(bd_dir) count = 0 for i in list_dir: if i.endswith(user_suffix): count += 1 else: count = 0 print(count)
2. 针对json实操 尝试单文件多用户(一行一个)是否可实现 哪个更方便
import os import json base_dir = os.path.dirname(__file__) db_dir = os.path.join(base_dir, 'db') if not os.path.exists(db_dir): os.mkdir(db_dir) username = input('username>>:').strip() password = input('password>>:').strip() user_dict = {'username': username, 'password': password} data = json.dumps(user_dict) file_path = os.path.join(db_dir, 'jason.json') with open(file_path, 'a', encoding='utf8')as f: f.write(data) f.write('\n') # json文件会报错 不方便
3.有一个目录文件下面有一堆文本文件
# 3. 有一个目录文件下面有一堆文本文件 # eg: # db目录 # J老师视频合集 # R老师视频合集 # C老师视频合集 # B老师视频合集 # 文件内容自定义即可 要求循环打印出db目录下所有的文件名称让用户选择 # 用户选择哪个文件就自动打开该文件并展示内容 # 涉及到文件路径全部使用代码自动生成 不准直接拷贝当前计算机固定路径 import os base_dir = os.path.dirname(__file__) db_dir = os.path.join(base_dir, 'db') if not os.path.exists(db_dir): os.mkdir(db_dir) list_dir = os.listdir(db_dir) while True: for i, j in enumerate(list_dir): print(i, j) choice = input('请输入你要选择的文件编号>>>:').strip() if not choice.isdigit(): print('文件编号必须是数字') continue choice = int(choice) if choice not in range(len(list_dir)): print('没有该文件编号') continue file_path = os.path.join(db_dir, list_dir[choice]) with open(file_path, 'r', encoding='utf8') as f: print(f.read())
4.周末大作业
# 4.周末大作业 # # 项目功能 # 1.用户注册 # 2.用户登录 # 3.添加购物车 # 4.结算购物车 # # 项目说明 # 用户数据采用json格式存储到文件目录db下 一个用户一个单独的文件 # 数据格式 {"name":"jason","pwd":123} # # ps:文件名可以直接用用户名便于校验 # 用户注册时给每个用户添加两个默认的键值对(账户余额 购物车) # {"balance":15000,"shop_car":{}} # 添加购物车功能 商品列表可以自定义或者采用下列格式 # good_list = [ # ['挂壁面',3] # ['印度飞饼', 22] # ['极品木瓜', 666], # ['土耳其土豆', 999], # ['伊拉克拌面', 1000], # ['董卓戏张飞公仔', 2000], # ['仿真玩偶', 10000] # ] # 用户可以反复添加商品,在购物车中记录数量 # {'极品木瓜':[个数,单价]} # 结算购物车 # 获取用户购物车中所有的商品计算总价并结算即可 # 针对添加购物车和结算只有登录的用户才可以执行 import os import json is_login = { 'username': None } def login_auth(func): def wrapper(*args, **kwargs): if not is_login.get('username'): print('您为登入,请先登入') login() else: res = func(*args, **kwargs) return res return wrapper base_dir = os.path.dirname(__file__) db_dir = os.path.join(base_dir, 'db') if not os.path.exists(db_dir): os.mkdir(db_dir) def register(): while True: username = input('username>>>:').strip() password = input('password>>>:').strip() user_dict = { 'username': username, 'password': password, 'balance': 15000, 'shop_car': {} } file_path = os.path.join(db_dir, f'{username}.json') if os.path.exists(file_path): print('用户名已存在') break else: with open(file_path, 'w', encoding='utf8') as f: json.dump(user_dict, f) print('注册成功') break def login(): while True: username = input('username>>>:').strip() password = input('password>>>:').strip() file_path = os.path.join(db_dir, f'{username}.json') if os.path.exists(file_path): with open(file_path, 'r', encoding='utf8') as f: user_dict = json.load(f) if password == user_dict['password']: print('登入成功') is_login['username'] = username break else: print('密码错误') break else: print('用户名不存在') break @login_auth def add_shop_car(): goods_dict = [ ['挂壁面', 3], ['印度飞饼', 22], ['极品木瓜', 666], ['土耳其土豆', 999], ['伊拉克拌面', 1000], ['董卓戏张飞公仔', 2000], ['仿真玩偶', 10000] ] temp_shop_car = {} while True: for i, j in enumerate(goods_dict): print(f'商品编号:{i} | 商品名称:{j[0]} | 商品单价:{j[1]}') choice = input('请输入商品编号或则按(q)退出>>>:').strip() if choice == 'q': file_path = os.path.join(db_dir, f"{is_login.get('username')}.json") with open(file_path, 'r', encoding='utf8') as f1: user_dict = json.load(f1) real_shop_car = user_dict.get('shop_car') for good_name in temp_shop_car: if good_name not in real_shop_car: real_shop_car[good_name] = temp_shop_car[good_name] else: real_shop_car[good_name][0] += temp_shop_car[good_name][0] user_dict['shop_car'] = real_shop_car with open(file_path, 'w', encoding='utf8') as f2: json.dump(user_dict, f2, ensure_ascii=False) print('购物车添加成功') break if not choice.isdigit(): print('商品编号必须是纯数字') continue choice = int(choice) if choice not in range(len(goods_dict)): print('没有该商品编号') continue target_num = input('请输入商品数量>>>:').strip() if target_num.isdigit(): target_num = int(target_num) target_shop_car = goods_dict[choice] target_goods_name = target_shop_car[0] target_goods_price = target_shop_car[1] if target_goods_name not in temp_shop_car: temp_shop_car[target_goods_name] = [target_num, target_goods_price] else: temp_shop_car[target_goods_name][0] += target_num else: print('商品数量必须是纯数字') @login_auth def close_shop_car(): file_path = os.path.join(db_dir, f"{is_login.get('username')}.json") with open(file_path, 'r', encoding='utf8') as f: user_dict = json.load(f) balance = user_dict.get('balance') real_shop_car = user_dict.get('shop_car') total_money = 0 if len(real_shop_car) == 0: print('没有商品,请先添加') return for good_num, good_price in real_shop_car.values(): total_money += good_price * good_num if balance >= total_money: user_dict['balance'] -= total_money user_dict['shop_car'] = {} with open(file_path, 'w', encoding='utf8') as f: json.dump(user_dict, f, ensure_ascii=False) print(f'今日消费{total_money}') else: print('余额不足') func_dict = { '1': register, '2': login, '3': add_shop_car, '4': close_shop_car } while True: print(""" 0. 退出 1. 注册 2. 登入 3. 添加购物车 4. 结算购物车 """) choice = input('请输入功能编号>>>:').strip() if not choice.isdigit(): print('功能编号必须是数字') continue if choice == '0': break if choice in func_dict: func_dict[choice]() else: print('没有该功能编号')