collections模块
在内置数据类型的基础上,collections模块为我们提供了更多的数据类型
1.namedtuple(具名元组)
定义语法:nametuple('元组名称','属性列表')
eg:
from collections import namedtuple
nametuple1 = namedtuple('坐标', ['x', 'y'])
aa = nametuple1(1, 2)
print(aa) # 坐标(x=1, y=2)
print(aa.x) # 1
nametuple2 = namedtuple('三维坐标',['x','y','z'])
bb = nametuple2(11,22,33)
print(bb) # 三维坐标(x=11, y=22, z=33)
print(bb.y) # 22
2.deque(双向列表 双端队列)
普通的列表添加删除操作只能从最后一个数据值开始,deque的appendleft和popleft支持我们从列表头部添加删除元素值。
定义语法:deque(['数据值1','数据值2'])
eg:
from collections import deque
a = deque([1,2,3])
a.appendleft(11)
print(a) # deque([11, 1, 2, 3])
3.OrderedDict(有序字典)
普通的字典内部元素是无序的
d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d) # {'a': 1, 'c': 3, 'b': 2}
要保证key的顺序可以使用有序字典
from collections import OrderedDict
d = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(d) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
4.defaultdict
有如下值集合 [11,22,33,44,55,66,77,88,99,90],
将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中
from collections import defaultdict
res = defaultdict(k1=[],k2=[])
print(res)
5.Counter(计数器)
快速地得出各个字符在字符串中的个数
eg:
res = 'abcdeabcdabcaba'
1.用for循环做:
new_dict = {}
for i in res:
if i not in new_dict:
new_dict[i] = 1
else:
new_dict[i] += 1
print(new_dict) # {'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}
2.计数器做
from collections import Counter
res1 = Counter(res)
print(res1) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
time模块
表示时间的三种的方式:
1.时间戳 time.time() # 1657786415.2864366
2.结构化时间 time.gmtime(1657786415.2864366)
# time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=8, tm_min=13, tm_sec=35, tm_wday=3, tm_yday=195, tm_isdst=0)
time.localtime() # 当前时区的结构化时间
3.格式化时间 time.strftime("%Y-%m-%d %H-%M-%S") # 2022-07-14 16:23:40
%Y %m %d %H %M %S 分别表示年月日时分秒
其中月日必须小写,HMS 可以缩写为 X
01 各个类型时间的相互转换
datetime模块
import datetime
res = datetime.datetime.today() # 2022-07-15 14:38:21.386788 获取当前时间,精确到秒
res1 = datetime.date.today() # 2022-07-15 获取当前时间,精确到天
print(res.hour) # 7
print(res1.day) # 15 两者都可以分别取单个值(年月日,时分秒)
print(datetime.datetime.now()) # 2022-07-15 14:46:02.207051 获取当前datetime
print(datetime.datetime.utcnow()) # 2022-07-15 06:46:02.207051 获取当前格林威治时间
'datetime.now 与 datetime.utcnow 也可以获取当前时间'
t1 = datetime.timedelta(days = 3)
print(res1 + t1) # 2022-07-18 输出res1过了三天之后的时间
timedelta括号里有许多种参数,没有的时间可以通过换算得来
os模块
os模块主要是跟当前程序所在的操作系统打交道
import os
1.生成与删除目录(文件)
os.mkdir('aaa') # 生成单级目录
os.makedirs('bbb/ccc') # 生成多级目录,也可生成单级目录
os.rmdir('aaa') # 删除单级空目录,若目录不为空或是多级目录则报错
os.removedirs('bbb/ccc') # 若目录为空则删除,并向上递归,若上一级目录也为空,也删除,以此类推
os.remove('aaa.txt') # 删除单个文件,不能删除文件夹
2.文件列举与重命名
os.rename('aaa', 'bbb') # 重命名文件夹或单个文件
os.listdir('D:\Python\pycharmProject\day24') # ['.idea', '01 datetime模块.py', '02 os模块.py', 'bbb']
# 列出指定文件夹下的所有文件和目录,包括隐藏文件,并以列表的形式打印
3.获取绝对路径
print(os.getcwd()) # D:\Python\pycharmProject\day24 获取当前文件所在的绝对路径
os.chdir("dirname") # 改变当前脚本工作目录;相当于shell下cd
print(os.path.abspath(__file__)) # D:\Python\pycharmProject\day24\02 os模块.py 获取当前文件所在的绝对路径
print(os.path.dirname(__file__)) # D:\Python\pycharmProject\day24 获取当前文件所在的目录路径
4.判断文件(夹)是否存在
# exists
print(os.path.exists('01 datetime模块.py')) # True
print(os.path.exists('ccc')) # False
print(os.path.exists('bbb')) # True
若参数文件(夹)在当前文件所在路径中(参数文件和当前文件在同一个目录下),返回True,否则返回False
# isfile isdir
print(os.path.isfile('bbb')) # False
print(os.path.isfile('ccc')) # False
print(os.path.isfile('02 os模块.py')) # True
(在当前文件所在路径中)若参数是一个存在的文件,返回True
print(os.path.isdir('bbb')) # True
print(os.path.isdir('ccc')) # False
print(os.path.isdir('02 os模块.py')) # False
(在当前文件所在路径中)若参数是一个存在的文件夹,返回True
5.拼接路径
absolute_path = os.path.dirname(__file__) # 获取当前文件所在目录的路径
relative_path = 'aaa.txt' # 需要拼接文件的路径
res = os.path.join(absolute_path, relative_path) # 拼接后的路径
print(res) # D:\Python\pycharmProject\day24\aaa.txt
# 拼接路径用join方法。不要使用+号。
# join可以自动识别当前所在的操作系统,并切换正确的分隔符
# win用\ mac用/
6.文件大小相关
print(os.path.getsize('01 datetime模块.py')) # 510 获取指定文件的大小,单位:字节
02 单级目录aaa和多级目录bbb/ccc已被创建
03 步骤02创建的两个目录已被删除
04 文件夹aaa已被改名为bbb
05 判断文件(夹)是否存在
sys模块
sys模块主要是跟python解释器打交道
import sys
print(sys.path) # 获取当前文件的所有path路径,结果以列表形式返回
print(sys.version) # 查看解释器信息
print(sys.platform) # 查看当前平台
res = sys.argv
'''需求 命令行执行当前文件必须要提供用户名和密码 否则不准执行'''
if len(res) == 3:
username = res[1]
password = res[2]
if username == 'jason' and password == '123':
print('您可以正在执行该文件')
else:
print('用户名或密码错误')
else:
print('请填写用户名和密码 二者不可或缺')
# 上述校验也可以使用异常捕获实现(课下实现)
json模块
1. json模块也被称为序列化模块,json、主要作为各个编程语言间数据交互的桥梁。可以把json理解为中间商或者翻译官。
python js
列表 <===> json <===> 数组
'将原本的列表、字典等转成json格式就叫序列化'
'将json格式再变为原来的列表、字典就叫反序列化'
2. 数据基于网络传输肯定是二进制,呢么在python中只有字符串可以调用encode方法转成二进制数据,索引json格式的数据也属于字符串。
3. json格式的特征
json是字符串 有标志性的双引号
例如:{"name": "jason", "age": 19} # 长得像字典,其实是json字符串
4. json的四个主要方法
dumps() 将其他数据类型转化成json格式字符串
loads() 将json字符串转化成对应的数据类型
dump() 将其他数据类型以json格式写入文件
load() 将文件中的json字符串读取出来并转换成相应数据类型
5. json方法实操
d = {'name': 'jason', 'pwd': 123}
需求:将上述字典存入文件中,并且取出来还是字典
d = {'name': 'jason', 'pwd': 123}
with open(r'user.txt', 'w', encoding='utf8') as f:
d = json.dumps(d)
f.write(d)
# 这两句可以简写为
# json.dump(d,f)
with open(r'user.txt', 'r', encoding='utf8') as f:
res = f.read()
d = json.loads(res)
# 这两句可以简写为
# d = json.load(f)
print(d)
json与os模块混合使用
import os
import json
# 获取当前文件的根目录
base_path = os.path.dirname(__file__)
# 如果db文件夹不存在则创建
if not os.path.exists('db'):
os.mkdir('db')
# 拼接db文件夹
db_path = os.path.join(base_path, 'db')
# 获取输入 并判断有无该用户文件
username = input('username>>>').strip()
password = input('password>>>').strip()
# 获取db文件夹下的所有用户文件 列表
user_list = os.listdir(db_path)
# 构建用户字典
user_dict = {
'username': username,
'password': password,
'balance': 15000,
'shop_car': []
}
# 用户文件路径
user_path = os.path.join(db_path, username)
if username not in user_list:
with open(user_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f)
else:
with open(user_path, 'r', encoding='utf8')as f:
res = json.load(f)
print(res, type(res))
06 操作代码展示
07 代码效果:在day24下新建db文件夹,在文件夹内新建用户文件:tony