猪行天下之Python基础——10.1 Python常用模块(上)(二)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 内容简述: 1、time和datetime模块 2、logging模块 PS:如果你想搜索安装某个模块或者发布一个自己的模块可以到移步到:pypi.org/

④ 一些实用的代码片段


下面提供一些很实用的代码片段,用到的时候复制粘贴即可:


import datetime
import time
now = datetime.datetime.now()
# 获得当前时间的前/后几天,几小时,几秒,毫秒
# 如果是想获得时间戳可以直接调用int(time.mktime(求出来的时间.timetuple()))
def fetch_before_time(time_type, value, strf="%Y-%m-%d %H:%M:%S"):
    if time_type == 'days':
        if value > 0:
            return (datetime.datetime.now() + datetime.timedelta(days=value)).strftime(strf)
        else:
            return (datetime.datetime.now() - datetime.timedelta(days=value)).strftime(strf)
    elif time_type == 'hours':
        if value > 0:
            return (datetime.datetime.now() + datetime.timedelta(hours=value)).strftime(strf)
        else:
            return (datetime.datetime.now() - datetime.timedelta(hours=value)).strftime(strf)
    elif time_type == 'seconds':
        if value > 0:
            return (datetime.datetime.now() + datetime.timedelta(seconds=value)).strftime(strf)
        else:
            return (datetime.datetime.now() - datetime.timedelta(seconds=value)).strftime(strf)
    elif time_type == 'microseconds':
        if value > 0:
            return (datetime.datetime.now() + datetime.timedelta(microseconds=value)).strftime(strf)
        else:
            return (datetime.datetime.now() - datetime.timedelta(microseconds=value)).strftime(strf)
# 获得第二天凌晨的时间戳
def fetch_morning_timestamp():
    return int(time.time()) + (144000 - (int(time.time())) % 86400)
# 构造一个由起始事件到结束时间间所有的日期列表
def init_date_list(begin_date, end_date):
    date_list = []
    begin_date = datetime.datetime.strptime(str(begin_date), "%Y%m%d")
    end_date = datetime.datetime.strptime(str(end_date), "%Y%m%d")
    while begin_date <= end_date:
        date_str = begin_date.strftime("%Y%m%d")
        date_list.append(date_str)
        begin_date += datetime.timedelta(days=1)
    return date_list
if __name__ == '__main__':
    print("当前时间:", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    print(fetch_before_time('days', 3))
    print(fetch_before_time('hours', -3))
    print(fetch_before_time('seconds', 3))
    print("第二天早上的时间戳:", fetch_morning_timestamp())
    print("从20190101到20190301的日期列表:%s" % init_date_list(20190101, 20190301))


运行结果如下


当前时间: 2019-03-14 15:44:58
2019-03-17 15:44:58
2019-03-14 18:44:58
2019-03-14 15:45:01
第二天早上的时间戳: 1552665600
从20190101到20190301的日期列表:['20190101', '20190102',...过长省略... '20190226', '20190227', '20190228', '20190301']


2、logging日志模块


大部分的程序都会有「记录运行日志的需求」,而日志信息一般有这样几类:正常的程序运行日志调试错误或警告信息的输出等。而日常开发中我们需要把日志持久化到本地,进行一些观察和统计,错误排查等,如果只用print函数输出的话,显然有点捉襟见寸。在Python内置了一个日志模块:logging,它提供了标准的日志接口,支持日志分级和存储


① 日志分级


在开始正式学习logging前,我们先了解下「日志分级」,即:什么时候用什么等级的日志。如下表所示:


级别 建议什么时候使用
DEBUG 详细的信息,常用于问题诊断
INFO 记录关键节点信息,用于确认程序是否按照预期运行
WARNING 程序还是正常运行,但某些不期望的事情发生时记录的信息(如磁盘可用空间较低)
ERROR 由于更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL 发生严重错误,导致程序不能继续运行时记录的信息


打印各种级别的代码示例如下:


import logging
if __name__ == '__main__':
    # 获得一个Logger
    logger = logging.getLogger("Test")
    # logging提供的简单的配置方法,自行配置的话需要手动添加handler
    logging.basicConfig()
    # 设置输出的log级别(大于或等于此级别的才会输出),默认级别Warning
    logger.setLevel(logging.INFO)
    logger.debug("=== Debug 级别的信息 ===") # 不会输出
    logger.info("=== Info 级别的信息 ===")
    logger.warning("=== Warning 级别的信息 ===")
    logger.error("=== Error 级别的信息 ===")
    logger.critical("=== Critical 级别的信息 ===")


运行结果如下


INFO:Test:=== Info 级别的信息 ===
WARNING:Test:=== Warning 级别的信息 ===
ERROR:Test:=== Error 级别的信息 ===
CRITICAL:Test:=== Critical 级别的信息 ===


② 将日志写入到文件


日志默认是输出到Console(屏幕)上,如果我们想把详细的日志输出到log文件里,则需要用到handler了,理论上可以把日志输出到各种流中stderr文件socket等都可以,在logging中已经将各种流handler封装好了,你也可以继承StreamHandler类自己做一些定制,简单的把日志写入到文件中的代码示例如下:


import logging
if __name__ == '__main__':
    logger = logging.getLogger("Test")
    logger.setLevel(logging.INFO)
    # 输出到控制台
    logger.addHandler(logging.StreamHandler())
    # 输出到文件
    logger.addHandler(logging.FileHandler('test.log', encoding='UTF-8'))
    logger.debug("=== Debug 级别的信息 ===")
    logger.info("=== Info 级别的信息 ===")
    logger.warning("=== Warning 级别的信息 ===")
    logger.error("=== Error 级别的信息 ===")
    logger.critical("=== Critical 级别的信息 ===")


运行结果如下(同时在目录下生成了一个test.log的文件):


=== Info 级别的信息 ===
=== Warning 级别的信息 ===
=== Error 级别的信息 ===
=== Critical 级别的信息 ===


嗯,你可能有这样的需求,Console打印Warning以上的日志,而log文件保存Debug级别以上的日志,那么可以修改下上面的代码,修改后的代码如下:


if __name__ == '__main__':
    logger = logging.getLogger("Test")
    logger.setLevel(logging.INFO)
    # 输出到控制台
    s_handler = logging.StreamHandler()
    s_handler.setLevel(logging.WARNING)
    logger.addHandler(s_handler)
    # 输出到文件
    f_handler = logging.FileHandler('test.log', encoding='UTF-8')
    f_handler.setLevel(logging.DEBUG)
    logger.addHandler(f_handler)
    logger.debug("=== Debug 级别的信息 ===")
    logger.info("=== Info 级别的信息 ===")
    logger.warning("=== Warning 级别的信息 ===")
    logger.error("=== Error 级别的信息 ===")
    logger.critical("=== Critical 级别的信息 ===")


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
158 62
|
2月前
|
Python
Python Internet 模块
Python Internet 模块。
133 74
|
3月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
141 63
|
3月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
3月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
133 61
|
3月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
3月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
1月前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
32 3
|
3月前
|
JSON Linux 数据格式
Python模块:从入门到精通,只需一篇文章!
Python中的模块是将相关代码组织在一起的单元,便于重用和维护。模块可以是Python文件或C/C++扩展,Python标准库中包含大量模块,如os、sys、time等,用于执行各种任务。定义模块只需创建.py文件并编写代码,导入模块使用import语句。此外,Python还支持自定义模块和包,以及虚拟环境来管理项目依赖。
Python模块:从入门到精通,只需一篇文章!
|
3月前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
90 5

热门文章

最新文章

推荐镜像

更多