一、datetime
1.1 介绍
datetime是python处理时间和日期的标准库datetime是python处理时间和日期的标准库
Python中提供了多个用于对日期和时间进行操作的内置模块:time模块、datetime模块和calendar模块。其中time模块是通过调用C库实现的,所以有些方法在某些平台上可能无法调用,但是其提供的大部分接口与C标准库time.h基本一致。time模块相比,datetime模块提供的接口更直观、易用,功能也更加强大。
datetime模块提供了处理日期和时间的类,既有简单的方式,又有复杂的方式。它虽然支持日期和时间算法,但其实现的重点是为输出格式化和操作提供高效的属性提取功能。
1.2 datetime模块中定义的类
类名称 | 描述 |
---|---|
datetime.date | 表示日期,常用的属性有:year, month和day |
datetime.time | 表示时间,常用属性有:hour, minute, second, microsecond |
datetime.datetime | 表示日期时间 |
datetime.timedelta | 表示两个date、time、datetime实例之间的时间间隔,分辨率(最小单位)可达到微秒 |
datetime.tzinfo | 时区相关信息对象的抽象基类。它们由datetime和time类使用,以提供自定义时间的而调整。 |
datetime.timezone | Python 3.2中新增的功能,实现tzinfo抽象基类的类,表示与UTC的固定偏移量 |
1.3 datetime模块中定义的常量
常量名称 | 描述 |
---|---|
datetime.MINYEAR | datetime.date或datetime.datetime对象所允许的年份的最小值,值为1 |
datetime.MAXYEAR | datetime.date或datetime.datetime对象所允许的年份的最大值,只为9999 |
1.4 datetim.datetime
类的使用
构造时间日期对象
datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
日期对象和时间对象的构造也是一样的。
常用方法
方法 | 作用 |
---|---|
datetime.datetime.now() |
获取系统当前时间 |
时间日期对象.timestamp() |
时间日期对象转化为时间戳 |
datetime.fromtimestamp(timestamp) |
时间戳转化为时间日期对象 |
时间日期对象.strftime(strformat) |
时间日期对象转化为字符串 |
datetime.datetime.strptime(strtime, strformat) |
时间字符串转化为时间日期对象 |
strformat
的格式化
格式 描述 %Y
完整年份 %y
去掉世纪的年份(00 - 99) %m
月份 ( 01 - 12) %d
日 %H
一天中的第几个小时(24小时制,00 - 23) %l
第几个小时(12小时制,01 - 12) %M
分钟数(00 - 59) %S
秒(00 - 59) %U
一年中的第几个星期 %w
一个星期中的第几天(0 - 6,0是星期天) %A
完整星期名称
关于
strtime
和strformat
说明时间字符串要与格式化的时间字符串一一对应
示例如下:
datetime.strptime(strtime, strformat) datetime.strptime("2019-09-10 16:29:02", '%Y-%m-%d %H:%M:%S')
1.5 datetime.timedelta
类的使用
构造可以用于计算的时间对象
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
示例
from datetime import datetime, timedelta
now = datetime.now()
dlt = timedelta(days=10)
print(now + dlt)
注意
两个时间日期对象可以计算的。会自动转换为timedelta对象。但是只能做减法。
二、logging
日志: 日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分。
2.1 日志等级
等级 | 英文 | 含义 |
---|---|---|
1 | DEBUG |
详细信息,通常仅在诊断问题时才受到关注 |
2 | INFO |
确认程序按预期工作 |
3 | WARNING |
出现了异常,但是不影响正常工作 |
4 | ERROR |
由于某些原因,程序 不能执行某些功能 |
5 | CRITICAL |
严重的错误,导致程序不能运行 |
python日志默认等级是WARNING
,这意味着只有级别大于等于这个级别的日志才会被记录.
2.2 logging
模块的基本使用
2.2.1 基本使用
import logging
logging.debug('调试信息, 通常在诊断问题的时候使用')
logging.info('普通信息,确认程序按照预期运行')
# python默认日志等级,只有在高于或等于时才会显示日志
logging.warning('可能会出现问题')
logging.error('错误信息,程序运行出现了一些问题,某些功能不能使用')
logging.critical('严重的错误,导致程序不能运行')
2.2.2 基本配置
在程序编写过程中日志的处理有时候不会按照logging默认行为,此时我们就要对他进行一些配置达到自定义的效果.我们会用到logging模块的配置函数logging.basicConfig()
logging.basicConfig()
函数的参数及其含义
参数 | 含义 |
---|---|
filename |
用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。 |
filemode |
文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w” |
format |
指定handler使用的日志显示格式。 |
datefmt |
指定日期时间格式。 |
level |
设置rootlogger(后边会讲解具体概念)的日志级别 |
stream |
用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为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。可能没有 %(process)d
进程ID。可能没有 %(message)s
用户输出的消息
示例代码
import logging
logging.basicConfig(
level=logging.DEBUG, # 配置捕捉日志等级
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', # 配置日志显示格式
) # 配置日志信息
logging.debug('调试信息, 通常在诊断问题的时候使用')
logging.info('普通信息,确认程序按照预期运行')
# python默认日志等级,只有在高于或等于时才会显示日志
logging.warning('可能会出现问题')
logging.error('错误信息,程序运行出现了一些问题,某些功能不能使用')
logging.critical('严重的错误,导致程序不能运行')
2.3 logging
模块化组件的使用
组件名称 | 类名 | 功能描述 |
---|---|---|
日志器 | Logger |
提供了应用程序可一直使用的接口 |
处理器 | Handler |
将logger 创建的日志记录发送到合适的目的输出 |
过滤器 | Filter |
提供了更细的控制工具来决定输出哪条日志记录,丢弃哪条日志记录 |
格式器 | Formatter |
决定日志记录的最终输出格式 |
使用示例代码
import logging
# 创建Logger 日志记录
logger = logging.getLogger(name='logger')
logger.setLevel(logging.DEBUG)
# 创建Handler 日志处理, 控制日志显示位置
handler_1 = logging.StreamHandler() # 控制台显示
handler_2 = logging.FileHandler('test.log') # 日志输出到文件
# 创建Formatter 日志格式器,控制日志显示格式
formatter = logging.Formatter(fmt='%(asctime)s -- %(name)s -- %(filename)s -- %(levelname)s -- %(message)s') # 日志格式控制
handler_1.setFormatter(formatter) # 应用日志格式器到handler对象
handler_2.setFormatter(formatter)
logger.addHandler(handler_1) # 应用日志处理器到logger对象
logger.addHandler(handler_2)