路飞学城Python-Day14
Level
|
Use
|
DEBUG
|
Detailed information, typically of interest only when diagnosing problems.
|
INFO
|
Confirmation that things are working as expected.
|
WARNING
|
An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected.
|
ERROR
|
Due to a more serious problem, the software has not been able to perform some function.
|
CRITICAL
|
A serious error, indicating that the program itself may be unable to continue running.
|
日志写文件
![](/assets/blank.gif)
自定义日志格式
%(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
|
用户输出的消息
|
日志同时输出到屏幕和文件
- logger提供了应用程序可以直接使用的接口;
- handler将(logger创建的)日志记录发送到合适的目的输出;
- filter提供了细度设备来决定输出哪条日志记录;
- formatter决定日志记录的最终输出格式。
每个组件的主要功能
logger
而核心模块可以这样:
还可以绑定handler和filters
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别
handler
每个Logger可以附加多个Handler。接下来我们就来介绍一些常用的Handler:
- logging.StreamHandler 使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。
- logging.FileHandler 和StreamHandler 类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件
- logging.handlers.RotatingFileHandler这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的函数是:
- 其中filename和mode两个参数和FileHandler一样。
- maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
- backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。
- S 秒
- M 分
- H 小时
- D 天
- W 每星期(interval==0时代表星期一)
- midnight 每天凌晨
formatter 组件
filter 组件
注意filter函数会返加True or False,logger根据此值决定是否输出此日志
下面的日志就会把符合filter条件的过滤掉
一个同时输出到屏幕、文件、带filter的完成例子
文件自动截断例子
引子
有没有更简单的方式?
re模块
常用的表达式规则
re的匹配语法有以下几种
- re.match 从头开始匹配
- re.search 匹配包含
- re.findall 把所有匹配到的字符放到以列表中的元素返回
- re.split 以匹配到的字符当做列表分隔符
- re.sub 匹配字符并替换
- re.fullmatch 全部匹配
- pattern 正则表达式
- string 要匹配的字符串
- flags 标志位,用于控制正则表达式的匹配方式
- re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
- M(MULTILINE): 多行模式,改变'^'和'$'的行为
- S(DOTALL): 改变'.'的行为,make the '.' special character match any character at all, including a newline; without this flag, '.' will match anything except a newline.
- X(re.VERBOSE) 可以给你的表达式写注释,使其更可读,下面这2个意思一样
练习:
- 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致
hint:re.search(r'\([^()]+\)',s).group()#可拿到最里层的括号中的值'(-40/5)'
为什么要设计好目录结构?
- 一类同学认为,这种个人风格问题"无关紧要"。理由是能让程序work就好,风格问题根本不是问题。
- 另一类同学认为,规范化能更好的控制程序结构,让程序具有更高的可读性。
- 可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等。从而非常快速的了解这个项目。
- 可维护性高: 定义好组织规则后,维护者就能很明确地知道,新增的哪个文件和代码应该放在什么目录之下。这个好处是,随着时间的推移,代码/配置的规模增加,项目结构不会混乱,仍然能够组织良好。
目录组织方式
- bin/: 存放项目的一些可执行文件,当然你可以起名script/之类的也行。
- foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/存放单元测试代码; (3) 程序的入口最好命名为main.py。
- docs/: 存放一些文档。
- setup.py: 安装、部署、打包的脚本。
- requirements.txt: 存放软件依赖的外部Python包列表。
- README: 项目说明文件。
关于README的内容
- 软件定位,软件的基本功能。
- 运行代码的方法: 安装环境、启动命令等。
- 简要的使用说明。
- 代码目录结构说明,更详细点可以说明软件的基本原理。
- 常见问题说明。
关于requirements.txt和setup.py
setup.py
- 安装环境时经常忘了最近又添加了一个新的Python包,结果一到线上运行,程序就出错了。
- Python包的版本依赖问题,有时候我们程序中使用的是一个版本的Python包,但是官方的已经是最新的包了,通过手动安装就可能装错了。
- 如果依赖的包很多的话,一个一个安装这些依赖是很费时的事情。
- 新同学开始写项目的时候,将程序跑起来非常麻烦,因为可能经常忘了要怎么安装各种依赖。
requirements.txt
- 方便开发者维护软件的包依赖。将开发过程中新增的包添加进这个列表中,避免在 setup.py 安装依赖时漏掉软件包。
- 方便读者明确项目使用了哪些Python包。
关于配置文件的使用方法
- 配置文件写在一个或多个python文件中,比如此处的conf.py。
- 项目中哪个模块用到这个配置文件就直接通过import conf这种形式来在代码中使用配置。
- 这让单元测试变得困难(因为模块内部依赖了外部配置)
- 另一方面配置文件作为用户控制程序的接口,应当可以由用户自由指定该文件的路径。
- 程序组件可复用性太差,因为这种贯穿所有模块的代码硬编码方式,使得大部分模块都依赖conf.py这个文件。
- 模块的配置都是可以灵活配置的,不受外部配置文件的影响。
- 程序的配置也是可以灵活控制的。
转载于:https://www.cnblogs.com/pandaboy1123/p/9297546.html
路飞学城Python-Day14相关推荐
- 路飞学城python全栈开发_[Python] 老男孩路飞学城Python全栈开发重点班 骑士计划最新100G...
简介 老男孩&路飞学城Python全栈开发重点班课程,作为Python全栈教学系列的重头戏,投入了全新的课程研发和教学精力,也是Python骑士计划的核心教学,由ALEX老师开班镇守,一线技术 ...
- 路飞学城—Python爬虫实战密训班 第三章
路飞学城-Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫:- 定义调度器- 定 ...
- b站路飞学城python课梨视频项目代码
@b站路飞学城python课梨视频项目代码 # -*- coding:utf-8 -*- import requests from lxml import etree import random im ...
- 路飞学城python开发入门学习
零基础参加了路飞学城python七天入门集训,由于无相关基础知识,所以笔记简陋,大家将就着看看,欢迎批评指正. 1.第一个程序: print('Hello,World") 2. python ...
- 路飞学城python电子书_路飞学城-Python开发集训-第一章
路飞学城-Python开发集训-第一章 1.本章学习心得.体会 我: 间接性勤奋. 我: 学习方法论:输入--输出---纠正 我: 对对对 走出舒适区, 换圈子, 转思路,投资自我加筹码. 我: 圈子 ...
- 路飞学城python全栈开发_python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)...
昨日内容回顾 1. 为什么要做前后端分离?-前后端交给不同的人来编写,职责划分明确.-API (IOS,安卓,PC,微信小程序...)-vue.js等框架编写前端时,会比之前写jQuery更简单快捷. ...
- 路飞学城-python爬虫密训-第三章
(一)学习心得 其实在没有正式学习python编程语言中,就知道模块是python最重要部分之一.虽然在前面HTTP协议跟IO多路复用都没有接触学的也是一知半解,scrapy模块比resquests模 ...
- 路飞学城-Python爬虫实战密训-第1章
正式的开始学习爬虫知识,Python是一门接触就会爱上的语言.路飞的课真的很棒,课程讲解不是告诉你结论,而是在告诉你思考的方法和过程. 第一章,学习了如何爬取汽车之家以及抽屉登录并点赞. 1 impo ...
- 路飞学城-Python 爬虫实战密训-第 1 章
本节学习体会: 鸡汤心得: 1.时代发展太快,要不断学习新东西,武装自己,才能跟得上时代的潮流,不然就是面临被pass的命运 2.要看清楚趋势,不要闭门造车 3.学习编程语言就跟学英语一样,方法很重要 ...
- 路飞学城-Python爬虫集训-第一章
自学Python的时候看了不少老男孩的视频,一直欠老男孩一个会员,现在99元爬虫集训果断参与. 非常喜欢Alex和武Sir的课,技术能力超强,当然讲着讲着就开起车来也说明他俩开车的技术也超级强! 以上 ...
最新文章
- 注册服务(addService)
- c++调用python3
- Codeforces 313
- 如何在RTSP/RTMP直播过程中加入SEI扩展数据发送和接收解析
- Java多线程--死锁例子
- fiddler模拟低速网络
- windows下的wxWidgets环境配置
- P2906 [USACO08OPEN]牛的街区Cow Neighborhoods
- Android接入google地图
- Execl同时冻结行和列
- 读django文档——nginx + uwsgi 部署django项目
- 微信公众号点击列表进入详情页
- Java循环控制语句
- 微信小程序 裁剪图片
- Latex论文中用到的花体字
- 修改字段名称、替换字符中的英文变中文括号
- 魔兽地图编辑器插件YDWE的使用与基本设置5 触发编辑器2 时间事件
- Flowable UI制作流程图
- 每个程序员都应该知道的 CPU 知识:NUMA
- SSD 驱动ssw101b 无线wifi