回顾
上篇博客我们简要介绍了包的相关知识和正则表达式,这部分非常重要希望大家好好参悟。最近,无事发生,或是说没发生什么重要的事。记得不真切了,应是卢梭的名言”命是弱者的借口,运是强者的谦辞。“,说的斩钉截铁,这点好啊,望我能不犹疑,人后的苦尚且还能克服,一些琐碎还是先放下吧,好了谈谈学习的事,成欤败欤?我们还需继续研究,今天我们学的是内置模块。
第六章 模块与包
内置模块
模块的介绍
在Python中,一个模块是一个包含一组相关函数、变量和类的文件。模块可以被其他程序引用,以便在程序中使用它们。在Python中,一个模块是一个包含一组相关函数、变量和类的文件。模块可以被其他程序引用,以便在程序中使用它们,要使用模块,可以使用
import
语句将其引入到程序中。在python中的内置模块有:
math:提供了一些基本的数学函数,如sin、cos、tan、sqrt等等。
random:提供了一些随机数生成函数,如随机整数、随机小数、随机选择等。
time:提供了一些与时间相关的函数,如获取当前时间、格式化时间、计时器等。
datetime:提供了日期和时间处理函数,如日期算术、日期比较、日期格式化等。
re:提供了正则表达式操作函数,用来匹配和操作字符串。
os:提供了与操作系统相关的函数,如文件操作、路径操作、进程操作、环境变量等。
sys:提供了一些与Python解释器相关的函数,如获取命令行参数、修改Python路径等。
json:提供了JSON数据编码和解码的功能等。
时间模块
和时间有关系的我们就要用到时间模块,在使用模块之前,应该首先导入这个模块
常用方法:time.sleep(sec)
(线程)推迟指定的时间运行,单位为秒
time.time
获取当前时间戳
三种时间表现形式
时间戳秒数
格式化的时间字符串2023-07-31 21:54:16
结构化时间它一般不是让人看的,让计算机看的
进行日期时间的运算
系统时间计算时间
时间日期格式化符号
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
OS模块
os模块是与操作系统交互的一个接口
- 操作文件的创建
生成多层递归目录
os.makedirs()
若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,以此类推
os.removedirs()
删除单机目录
若目录不为空则无法删除,报错:相当于shell中rmdir dirname
os.rmdir()
列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.listdir()
删除一个文件
os.remove()
重命名一个文件
os.rename()
重命名文件/目录
os.rename("oldname","newname")
获取文件/目录信息
os.stat()
运行shell命令,直接显示
os.system()
运送shell命令,获取执行结果
os.popen()
获取当前工作目录,即当前python脚本工作的目录路径
os.getcwd()
改变当前脚本工作目录,相当于shell下cd
os.chdir()
- 操作文件的路径
返回path规范化的绝对路径
os.path.abspath(path)
将path分割成目录和文件名二元组返回
os.path.split(path)
返回path的目录。
其实就是
os.path.split(path)
的第一个元素返回path最后的文件名。
如何
path以 / 或 \ 结尾
,那么就会返回空值。即
os.path.split(path)
的第二个元素os.path.basename(path)
如果path存在,返回True;
如果path不存在,返回False
os.path.exists(path)如果path是绝对路径,返回True
os.path.isads(path)如果path是一个存在的文件,返回True。
否则返回False
os.path.isfile(path)如果path是一个存在的目录,则返回True。
否则返回False
os.path.isdir(path)
将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.join(path1[,path2[...]])
返回path所指向的文件或者目录的最后访问时间
os.path.getatime(path)
返回path所指向的文件或者目录的最后修改时间
os.path.getmtime(path)
返回path的大小
os.path.getsize(path)
- 目录信息的结构说明
stat 结构:
st_mode
inode 保护模式
st_ino
inode 节点号。
st_dev
inode 驻留的设备。
st_nlink
inode 的链接数。
st_uid
所有者的用户ID。
st_gid
所有者的组ID。
st_size
普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
st_atime
上次访问的时间。
st_mtime
最后一次修改的时间。
st_ctime
由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
- OS模块属性
os.sep
输出操作系统特定的路径分隔符win下为 "\"
Linux下为 "/"
os.linesep
输出当前平台使用的行终止符win下为 "\r\n"
Linux下为 "\n"
os.pathsep
输出用于分割文件路径的字符串win下为 ;
Linux下为 :
os.name
输出字符串指示当前使用平台。win 'nt'
Linux 'posix'
random模块
import random
- 随机小数
大于0且小于1之间的小数
random.random()大于1小于3的小数
random.uniform(1,3)
- 随机整数
大于等于1且小于等于5之间的整数
random.randint(1,5)
大于等于1且小于10之间的奇数
random.randrange(1,10,2)
- 随机选择一个返回
随机选择多个返回,返回的个数为函数的第二个参数
random.choice([1,'23',[4,5]])
列表元素任意2个组合
random.sample([1,'23',[4,5],2])
sys模块
sys模块是与python解释器交互的一个接口
sys.argv命令行参数List,第一个元素是程序本身路径
sys.exit(n)退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version获取Python解释程序的版本信息
sys.path返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform返回操作系统平台名称
序列化模块
Python中比较常用的序列化模块有:pickle、json
json序列化其实就是字符串,序列化就是把其他数据类型转化为json字符串的过程,反序列化就是把json字符串转化为其他数据类型
json数据类型
d = {"name":"mark","age":18}
这是json的序列化模式,注意是双引号
d = {'name':'mark','age':18}
这是字典,单引号,与上面的json序列化的数据类型不同,要注意
- json数据的作用
解释器的字典
json模块——>字符串
把字典用json读取成字符串
- json的相关操作
针对数据
json.dumps()
json.loads()
针对文件
json.dump()
json.load()
- 将字典写入文件并以字典读出
import json
d ={"name": "coco", "age": 19}
with open('a.txt', 'w', encoding='utf-8')as f:
f.write(json.dumps(d))
反序列化
with open('a.txt', 'r', encoding='utf-8')as f3:
res1 = f3.read()
res2 = json.loads(res1)
print(res2)
pickle模块
pickle的使用方式跟json一模一样,json中有四个方法,pickle也是这四个方法,但是他与json的区别就是pickie可以将所有的数据类型序列化,但是只能在python中使用,而json能够序列化的数据类型:dict,list,tuple,int,float,pickie序列化之后的结果是二进制。
pickle读取
写入文件的内容不可以修改,怎么存的就怎么取出
import pickle
d = [1, 2, 3, 4]
print(pickle.dumps(d))
with open('a.txt', 'wb')as f:
pickle.dump(d, f)
with open('a.txt', 'rb')as f1:
print(pickle.load(f1))##[1, 2, 3, 4]
hashlib模块
摘要算法:又称哈希算法,散列算法。通过一个函数把任意长度的数据转换长度固定的数据串(通常使用十六进制表示)
- 加密算法
算法:MD5, sha系列,sha1,sha128,sha256等
m = hashlib.md5()
指定加密数据:
m.update(b)
不管输入加密数据有多长,得到的加密串结构是固定的。
加盐:加密的时候在多一个干扰项
logging模块
- 什么是日志
logging是Python标准库中的一个模块,用于记录日志信息。通过logging模块,我们可以在程序运行时输出各种级别的日志,包括调试信息、错误信息、警告信息等,方便程序的调试和维护。同时,我们还可以将日志信息保存到文件或者发送到其他地方,以便后续的查阅和分析。
- 日志的级别
导入logging模块
import logging
日志的输出级别
logging.debug('debug message')
logging.info('info message ')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
在Python中默认的日志级别设置为Warning级别
日志级别等级 CRITICAL > ERROR > WARNING > INFO > DEBUG
- 日志格式
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s'
filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息
- 日志的基本使用
import logging
file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
指定日志存储的格式:
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s - %(lineno)d行 - %(created)f : %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p', # 2023-09-25 10:23:31 AM
handlers=[file_handler,],
level=logging.DEBUG
)
logging.debug('你好a aaa')
- 日志的详细使用
logging库提供了多个组件:Logger、Handler、Filter、Formatter
import logging
logger对象:负责产生日志
logger = logging.getLogger('转账记录')
filter对象:负责过滤日志(直接忽略)
handler对象:负责日志产生的位置hd1 = logging.FileHandler('a1.log',encoding='utf8') # 产生到文件的
hd2 = logging.FileHandler('a2.log',encoding='utf8') # 产生到文件的
hd3 = logging.StreamHandler() # 产生在终端的
formatter对象:负责日志的格式
fm1 = logging.Formatter(
fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
)
fm2 = logging.Formatter(
fmt='%(asctime)s - %(name)s %(message)s',
datefmt='%Y-%m-%d',
)绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
绑定formatter对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
设置日志等级
logger.setLevel(30)
记录日志
logger.warning('写了半天 好累啊 好热啊')
- 日志配置成字典格式使用(重要)
import logging
import logging.configstandard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' # 其中name为getlogger指定的名字simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
test_format = '%(asctime)s] %(message)s'
other_format = '[%(levelname)s][%(asctime)s]] %(message)s'import os
base_dir = os.path.dirname(os.path.abspath(__file__))
log_path = os.path.join(base_dir, 'log')
if not os.path.exists(log_path):
os.mkdir(log_path)logfile_path = os.path.join(log_path, 'a3.log')
log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},'other': {
'format': other_format
},},
'filters': {},过滤日志
'handlers': {
打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024 * 1024 * 100, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
'other': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'other'
},},
'loggers': {
logging.getLogger(__name__)拿到的logger配置 空字符串作为键 能够兼容所有的日志
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
},当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
'default': {
'handlers': ['default', ],
'level': 'DEBUG',
'propagate': False,
},'console': {
'handlers': ['console', 'default'],
'level': 'DEBUG',
'propagate': False,
},
'other': {
'handlers': ['other'],
'level': 'DEBUG',
'propagate': False,
},
},
}使用配置字典
def common(xxx):
logging.config.dictConfig(LOGGING_DIC)自动加载字典中的配置
logger1 = logging.getLogger(xxx)
return logger1logger=common('default')
logger.debug('xxx')
logger.info('xxx')
logger.warning('xxx')
第三方模块的下载与安装
之前学习的模块都是内置的模块,不需要安装的,直接拿来使用。但是,内置模块不能够满足我们日常的开发需求,有时候呢需要借助于一些第三方的模块(别人开发的,下载使用)
如何下载与使用第三方模块: pip 命令是有Python解释器提供的
pip install 模块名默认装的是最新的版本
pip3.8 install django==版本名pip list 查看解释器中已经安装了哪些模块
为了加快下载的速度,我们把默认的官网源修改成我们国内的源
换源
国内的源:
豆瓣:http://pypi.douban.com/simple/
阿里云:http://mirrors.aliyun.com/pypi/simple/
华为云:https://repo.huaweicloud.com/repository/pypi/simple
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
中科大:https://pypi.mirrors.ustc.edu.cn/simple/换源的方法:
pip install django默认使用的是python官方的
pip3.8 install numpy -i http://mirrors.aliyun.com/pypi/simple/临时换源
永久换源:
Windows
在文件地址栏输入:%APPDATA% 回车,快速进入 C:\Users\电脑用户\AppData\Roaming 文件夹中
新建 pip 文件夹并
在文件夹中新建 pip.ini 配置文件
配置文件写入:
如果想换源就直接把源的路径换了就可以了
[global]
index-url = https://mirrors.aliyun.com/pypi/simple
[install]
use-mirrors =true
mirrors =https://mirrors.aliyun.com/pypi/simple
trusted-host =mirrors.aliyun.com
以后再命令行中,下载模块,就会走国内源了
pip3.8 install django==3.2.12