datetime模块
datetime是python处理时间和日期的标准库。包含很多时间类。
类名 | 描述 |
---|---|
date | 日期对象,常用的属性有year、month、day |
time | 时间对象,常用属性有hour、minute、second、毫秒 |
datetime | 日期时间对象,常用的属性有hour, minute, second, microsecond |
timedelta | 时间间隔,即两个时间点之间的长度 |
在datetime模块中,最常用的是主要使用:
datetime.datetime( ) 、 datetime.timedelta( )
import datetime
dt = datetime.time(12,30,30,50) #时,分,秒,毫秒
print('dt的时间为: {}'.format(dt))
dd = datetime.date(2019,5,5) #年 月 日
print('dd的时间为: {}'.format(dd))
d_time = datetime.datetime(2019,5,5,12,30,50) #年 月 日 时 分 秒 毫秒
print('d_time的时间为: {}'.format(d_time))
t = datetime.datetime.now() - d_time #时间相减,可得固定时间的间隔
print('时间间隔为: {}'.format(t))
输出:
dt的时间为: 12:30:30.000050
dd的时间为: 2019-05-05
d_time的时间为: 2019-05-05 12:30:50
时间间隔为: 0:44:17.309240
Process finished with exit code 0
datetime类的常用方法:
类名 | 描述 |
---|---|
datetime.now() | 获取当前时间 |
时间日期对象.timestamp() | 日期时间转换为时间戳,例如:dayetime.now().timestamp() |
datetime.fromtimestamp(时间戳) | 时间戳转化为日期时间,例如:datetime.fromtimestamp(1534231316.796308) |
时间日期对象.strftime(format) | 时间日期对象转字符串,例如: datetime.now().strftime("%Y-%m-%d") |
datetime.strptime(date_str,format) | 字符串转日期时间对象例如: datetime.strptime('2018-3-22 15:28:18', '%Y-%m-%d %H:%M:%S') |
格式化字符串常用格式
格式 | 描述 |
---|---|
%Y/%y | 年 |
%m | 月 |
%d | 日 |
%H/%I | 时 |
%M | 分 |
%S | 秒 |
import datetime
dd = datetime.datetime.now()
print('当前时间为: {}'.format(dd))
ddt = datetime.datetime.now().timestamp()
print('当前时间戳为: {}'.format(ddt))
ddts = datetime.datetime.now().fromtimestamp(ddt)
print('当前时间戳转为时间为: {}'.format(ddts))
ddzfc = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print('当前时间转字符串为: {}'.format(ddzfc))
dddd = datetime.datetime.strptime(ddzfc,'%Y-%m-%d %H:%M:%S')
print('当前字符串转时间为: {}'.format(dddd))
输出:
当前时间为: 2019-05-05 13:53:08.692527
当前时间戳为: 1557035588.692527
当前时间戳转为时间为: 2019-05-05 13:53:08.692527
当前时间转字符串为: 2019-05-05 13:53:08
当前字符串转时间为: 2019-05-05 13:53:08
Process finished with exit code 0
时间运算
datetime.timedelta( days=0,seconds=0, microseconds=0,milliseconds=0,minutes=0, hours=0, weeks=0 )
timedelta的属性包含days、seconds、microseconds、milliseconds、minutes、hours、weeks
import datetime
now = datetime.datetime.now().date()
result_time_before = now + datetime.timedelta(days=3) #3天后的时间
print('3天前的时间为: {}'.format(result_time_before))
now = datetime.datetime.now().date()
result_time_after = now - datetime.timedelta(days=3) #3天前的时间
print('3天后的时间为: {}'.format(result_time_after))
输出:
3天前的时间为: 2019-05-08
3天后的时间为: 2019-05-02
Process finished with exit code 0
logging模块
软件中通过日志记录程序运行状况是一个开发的好习惯,对于错误排查核系统运维都是有非常大的帮助,python标准库自带日志模块,程序的日志功能直接调用标准库的日志模块即可。通过日志,开发者可以清楚的了解发生了哪些事情。包括出现了哪些错误。
logging中几种日志等级:
日志等级 | 描述 |
---|---|
DEBUG | 调式信息,通常在诊断问题时候用的着 |
INFO | 普通信息,确认程序按照预期运行 |
WARNING | 警告信息,表示发生意想不到的事情,或者指示接下来可能会出现一些问题,但是程序还是继续运行 |
ERROR | 错误信息,程序运行中出现了一些问题,程序某些功能不能执行 |
CRITICAL | 危险信息,一个严重的错误,导致程序无法继续运行 |
日志模块中formatter格式
日志格式 | 描述 |
---|---|
%(asctime)s | 日志事件发生的时间 |
%(levelname)s | 该日志记录的日志级别 |
%(message)s | 该日志记录的日志内容 |
%(name)s | 日志所使用日志器的名称,默认为‘root’ |
%(pathname)s | 调用日志记录函数的文件的全路径 |
%(filename)s | 调用日志记录函数的文件 |
%(funcname)s | 调用日志记录函数的函数名 |
%(lineno)d | 调用日志记录函数的代码所在的行数 |
import logging
LOG_for= "日志时间:%(asctime)s,日志级别:%(levelname)s,日志内容:%(message)s"
logging.basicConfig(level=logging.DEBUG,format=LOG_for)
logging.debug('这是调试日志')
logging.info('这是运行日志')
logging.warning('这是警告日志')
logging.error('程序出错了')
logging.critical('系统崩溃了')
输出:
日志时间:2019-05-05 14:43:33,344,日志级别:DEBUG,日志内容:这是调试日志
日志时间:2019-05-05 14:43:33,345,日志级别:INFO,日志内容:这是运行日志
日志时间:2019-05-05 14:43:33,345,日志级别:WARNING,日志内容:这是警告日志
日志时间:2019-05-05 14:43:33,345,日志级别:ERROR,日志内容:程序出错了
日志时间:2019-05-05 14:43:33,345,日志级别:CRITICAL,日志内容:系统崩溃了
Process finished with exit code 0
如果只是简单的使用logging,那么上面已经足够了。但是要实现定制log,那么可就需要更加深入的了解,logging模块还提供了模块化组件的方法,来灵活的配置日志器。
组件 | 描述 |
---|---|
Loggers(日志记录器) | 提供程序直接使用的接口 |
Handlers(日志处理器) | 将记录的日志发送到指定的位置 |
Filters(日志过滤器) | 用于过滤特定的日志记录 |
Formatters(日志格式器) | 用于控制日志信息的输出格式 |
模块化组件的使用步骤:
1、创建一个logger(日志记录器)对象;
2、定义handler(日志处理器),决定把日志发送到哪里;
1)、streamhandler ===> 输出到控制台
2)、Filehandler ===> 输出到指定文件
3、设置日志级别(level)和输出格式formatters(日志格式器)
4、把handler添加到对应的logger中去
import logging
#第一步,创建一个logger
logger = logging.getLogger('{}_log'.format(__name__))
logger.setLevel(logging.DEBUG) #设置日志等级
#第二步,创建一个Handler,用于写入日志
fh = logging.FileHandler('text.log',mode='a') #写入文件
fh.setLevel(logging.DEBUG) #设置写入文件的日志等级
dh = logging.StreamHandler() #在控制台输出
dh.setLevel(logging.DEBUG) #设置控制台输出日志等级
#第三步 ,定义handler的输出格式
formatter = logging.Formatter(
'日志时间:%(asctime)s,'
'日志级别:%(levelname)s,'
'日志内容:%(message)s,'
)
fh.setFormatter(formatter) #设置文件输出格式
dh.setFormatter(formatter) #设置控制台输出格式
#第四步,将对应的handler添加到logger中
logger.addHandler(fh)
logger.addHandler(dh)
if __name__ == '__main__':
def add_num(m,n):
try:
for i in range(10):
num = (m+n)/i
logger.info(num)
return num
except Exception as e:
logger.error(e)
add_num(2,3)
输出:
日志时间:2019-05-05 15:43:16,149,日志级别:ERROR,日志内容:division by zero,
Process finished with exit code 0