day 14 项目目录规范; time ; logging
import sys
print(sys.modules) 程序一运行,解释器将里面的所有内容全部加载到内存
项目目录规范:
代码不可能全部只写在一个文件,十几万行代码,调整,修改都很不方便。
所以要将代码规范化:
目录规范化, 具体代码规范,PEP8规范等等
目录规范化好处?
1、项目结构清晰,便于查找
2、对项目修改,易于调试
常用目录结构:
文件夹 \ 文件 作用
core \ src 主逻辑文件
lib \ commom 公共组件
bin \ starts 启动文件
conf \ settings 配置文件
log \ access.log 日志文件
db \ 数据文件,账号密码,流水等
time, datetime 模块 :
time模块给咱们提供的时间有三种形式:
第一种形式
time.time() 时间戳,从1970-01-01 00:00:00 距今时间,计算机用
第二种形式:格式化时间(人类使用)
2019/01/10 10:38 strftime()
print(time.time()) # 时间戳
print(time.strftime('%Y/%m/%d')) # 2019/01/08
ft = time.strftime("%y{}%m{}%d{} %I:%M:%S ".format('年', '月', '日')) 这样不行
ft = time.strftime("%y{}%m{}%d{} %I:%M:%S ").format('年', '月', '日')
格式化时间的多种用法
%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 当前时区的名称
%% %号本身 python中时间日期格式化符号: python中时间日期格式化符号
多种格式化时间的用法
第三种形式:结构化时间以元组的形式存在
作为格式化时间与时间戳进行转换
struct_time = time.localtime()
print(struct_time)
# time.struct_time(tm_year=2019, tm_mon=1, tm_mday=8, tm_hour=20,
# tm_min=39, tm_sec=53, tm_wday=1, tm_yday=8, tm_isdst=0)
print(struct_time[0]) #
print(struct_time.tm_year) #
时间戳与结构化时间之间的转换:
# 格式化时间 ----> 结构化时间
ft = time.strftime('%Y/%m/%d %H:%M:%S')
st = time.strptime(ft,'%Y/%m/%d %H:%M:%S')
print(st)
# 结构化时间 ---> 时间戳
t = time.mktime(st)
print(t) # 时间戳 ----> 结构化时间
t = time.time()
st = time.localtime(t)
print(st)
# 结构化时间 ---> 格式化时间
ft = time.strftime('%Y/%m/%d %H:%M:%S',st)
print(ft)
计算时间差:
import time
true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S'))
dif_time=time_now-true_time
struct_time=time.gmtime(dif_time)
print('过去了%d年%d月%d天%d小时%d分钟%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1,
struct_time.tm_mday-1,struct_time.tm_hour,
struct_time.tm_min,struct_time.tm_sec)) 计算时间差
计算时间差
datetime模块
import datetime
now_time = datetime.datetime.now()
print(now_time) # 2019-01-08 20:46:59.857607
# 只能调整的字段:weeks days hours minutes seconds
print(datetime.datetime.now() + datetime.timedelta(weeks=3)) # 三周后
print(datetime.datetime.now() + datetime.timedelta(weeks=-3)) # 三周前
print(datetime.datetime.now() + datetime.timedelta(days=-3)) # 三天前
print(datetime.datetime.now() + datetime.timedelta(days=3)) # 三天后
print(datetime.datetime.now() + datetime.timedelta(hours=5)) # 5小时后
print(datetime.datetime.now() + datetime.timedelta(hours=-5)) # 5小时前
print(datetime.datetime.now() + datetime.timedelta(minutes=-15)) # 15分钟前
print(datetime.datetime.now() + datetime.timedelta(minutes=15)) # 15分钟后
print(datetime.datetime.now() + datetime.timedelta(seconds=-70)) # 70秒前
print(datetime.datetime.now() + datetime.timedelta(seconds=70)) # 70秒后 current_time = datetime.datetime.now()
# 可直接调整到指定的 年 月 日 时 分 秒 等 print(current_time.replace(year=1977)) # 直接调整到1977年
print(current_time.replace(month=1)) # 直接调整到1月份
print(current_time.replace(year=1989,month=4,day=25)) # 1989-04-25 18:49:05.898601 # 将时间戳转化成时间
print(datetime.date.fromtimestamp(1232132131)) # 2009-01-17
datetime
日志:
开发中的日志:
1、日志帮助你调试代码
2、代码的警告,危险提示作用
3、你对服务器的操作命令
4、重要的节点,需要日志提示。
logging的,低,中,高,配
低配:
值打印到屏幕
import logging
logging.debug('debug message') # 调试模式
logging.info('info message') # 正常运转模式
logging.warning('warning message') # 警告模式 默认从这里开始打印到屏幕
logging.error('error message') # 错误模式
logging.critical('critical message') #致命的 崩溃模式
while 1:
try:
num = input('>>>')
int(num)
except ValueError:
logging.warning('输入非数字元素,警告!')
低配v1
import logging
# 制定显示信息格式
logging.basicConfig(
# level=logging.DEBUG, # 设定级别
level=20, # 设置级别
format='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s',
# datefmt='%a, %d %b %Y %H:%M:%S', # 显示时间格式
# filename='test.log',
# filemode='w'
)
logging.debug('debug message') # 调试模式 10
logging.info('info message') # 正常运转模式 20
logging.warning('warning message') # 警告模式 30
logging.error('error message') # 错误模式 40
logging.critical('critical message') #致命的 崩溃模式 50
低配v2
中配
标配
# 1.产生logger对象
# logger = logging.getLogger() # # 2 产生其他对象(屏幕对象,文件对象)
# sh = logging.StreamHandler()
# fh1 = logging.FileHandler('staff.log', encoding='utf-8')
# fh2 = logging.FileHandler('boss.log', encoding='utf-8')
#
# # 3,设置显示格式
# formater = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 执行设置显示格式
# formater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 执行设置显示格式
# formater2 = logging.Formatter('%(asctime)s-%(message)s') # 执行设置显示格式
#
# # 4,给对象绑定格式
# sh.setFormatter(formater)
# fh1.setFormatter(formater1)
# fh2.setFormatter(formater2)
#
# # 5 给logger对象绑定其他对象
# logger.addHandler(sh)
# logger.addHandler(fh1)
# logger.addHandler(fh2)
#
# # 6 设置显示级别
# # 其他对象的级别要高于logger的级别
# logger.setLevel(40)
# sh.setLevel(20)
# fh1.setLevel(30)
# fh2.setLevel(50)
#
#
# logging.debug('debug message') # 调试模式 10
# logging.info('info message') # 正常运转模式 20
# logging.warning('warning message') # 警告模式 30
# logging.error('error message') # 错误模式 40
# logging.critical('critical message') #致命的 崩溃模式 50
高配
import os
import logging.config # 定义三种日志输出格式 开始 # 标准版 格式
standard_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' # boss版格式(lowb版)
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s' # 定义日志输出格式 结束 logfile_name = r'D:\python骑士计划3期\day14\log\staff.log' # log文件名 # log配置字典 LOGGING_DIC = {
'version': 1, # 版本
'disable_existing_loggers': False, # 可否重复使用之前的logger对象
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
'boss_formatter':{
'format': id_simple_format
},
},
'filters': {},
'handlers': {
#打印到终端的日志
'stream': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志 文件句柄
'file': {
'level': 20,
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard', #标准
'filename': logfile_name, # 日志文件
'maxBytes': 300, # 日志大小 300 bit
'backupCount': 5, #轮转文件数
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置
'': {
'handlers': ['stream', 'file'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG', # 总级别
'propagate': True, # 向上(更高level的logger)传递
},
},
}
# 字典中第一层的所有key都是固定不可变的。
import logging
logging.config.dictConfig(LOGGING_DIC)
logger = logging.getLogger() # 这个logger对象是通过自己个性化配置的logger对象
logger.info('运转正常') # def load_my_logging_cfg():
# logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
# logger = logging.getLogger(__name__) # 生成一个log实例
# logger.info('It works!') # 记录该文件的运行状态
#
# if __name__ == '__main__':
# load_my_logging_cfg()
day 14 项目目录规范; time ; logging的更多相关文章
- python 之 软件开发目录规范 、logging模块
6.4 软件开发目录规范 软件(例如:ATM)目录应该包含: 文件名 存放 备注 bin start.py,用于起动程序 core src.py,程序核心功能代码 conf settings. ...
- Java Web 项目目录规范
一.项目结构 这里和其他项目区别不大,我将模板抽离出来,更容易分析和理解: 解释一下:js主要包括extends(引入第三方的js).module(项目模块自己的js).lib(引用包,这里也可以继续 ...
- python开发流程及项目目录规范
# 项目开发流程 1.调研 2.需求分析 ---产品经理 3.任务分配 ---项目经理 4.写项目demo ---项目经理.架构师.程序猿 5.架构分析 ---项目经理.架构师 6.编 ...
- python常用模块:项目目录规范、定制程序入口、自定义模块、引用变量、time和datetime模块
今天讲课内容有两大部分: 一.文件目录规范二.定制程序入口三.使用标准目录后四.常规函数time.datetime 一.标准目录规范 之前用过的案例atm机+购物商城代码过长,在学习了模块和包以后,我 ...
- Python代码项目目录规范v1.0
程序目录规范:bin # 存放可执行程序 xxxx.py # 程序主程序(入口文件)config # 存放配置信息 settings.py # 全局配置文件(可能暂时未应用)db # 存放数据文件 c ...
- Python模块:Re模块、附软件开发目录规范
Re模块:(正则表达式) 正则表达式就是字符串的匹配规则 正则表达式在多数编程语言里都有相应的支持,Python里面对应的模块时re 常用的表达式规则:(都需要记住) “ . ” # 默认匹配除 ...
- python学习之-项目开发目录规范
软件目录结构规范有什么好处: 通过规范化,能够更好的控制软件结构,让程序具有更高的可读性. 项目目录组织结构如下: Foo/ # 项目名 --bin/ # 可执行文件目录 --foo # 可执行程序 ...
- Serv-U FTP版本控制服务器 - 目录规范
背景 公司要组建一个版本控制服务器,选定了serv-u,初始目的是应用于war级的一些标准组件的版本控制/测试交付/统一对外发布渠道. 项目过程图: 如果不使用版本控制会出现什么问题? War标准组件 ...
- 生产环境下Flask项目目录构建
接触Flask已经有大半年了,本篇博客主要来探讨如何规范化生产环境下Flask的项目目录结构.虽然目录结构见仁见智,个人有个人的看法和习惯,但总的来说,经过很多人的实践和总结,还是有很多共同的意见和想 ...
随机推荐
- DevExpress控件TExtLookupComboBox实现多列模糊匹配输入的方法
本方案不需要修改控件源码,是完美解决支持多列模糊匹配快速输入的最佳方案!! 1.把列的Properties属性设置为ExtLookupComboBox. Properties.Incrementa ...
- MySQL5.7 并行复制配置
转自:https://www.cnblogs.com/langdashu/p/6125621.html [MySQL] 号称永久解决了复制延迟问题的并行复制,MySQL5.7 一.缘由: 某天看到主从 ...
- Delphi TQuery 的Locate用法
Help里的解释 function Locate(const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions) ...
- Java IO流学习总结七:Commons IO 2.5-FileUtils
在上面的几篇文章中,介绍了IO的常规用法,今天介绍 Commons IO 框架的使用. Commons IO简介 Apache Commons IO是Apache基金会创建并维护的Java函数库.它提 ...
- FlashDevelop 发布SWC
环境配置: 1.安装32位Java,经测试可用的 链接:http://pan.baidu.com/s/1i4CraXR 密码:xuud 2.ant,链接:http://pan.baidu.com/s/ ...
- 如何遍历Set对象
对 set 的遍历 1.迭代遍历: Set<String> set = new HashSet<String>(); Iterator<String> it = s ...
- Delphi动态配置ODBC数据源--SQL Server版本
(摘自)http://jxlearnew.blog.163.com/blog/static/549786592007102451431413/ 这里介绍一种用Delphi来实现动态注册的方法,希望对各 ...
- Delphi编写Shell扩展
用delphi创建一个外壳扩展(Shell Extension)程序的基本步骤如下: (1) 创建一个 ActiveX Library 工程,命名为“CloudUpload“(2) 创建一个新的自动化 ...
- 升级tensorflow1.0到1.3,报错ImportError: libcudnn.so.6: cannot open shared object file: No such file or directory Failed to load the native TensorFlow runtime.
先定位问题,发现在 /usr/local/cuda/include/ /usr/local/cuda/lib64/ 下面只有 libcudnn.so.5 因此,只要下载cudnn6.*版本的文件分别覆 ...
- JS----贪吃蛇游戏
在网上找到的几种例子 <!DOCTYPE html> <html > <head> <meta http-equiv="Content-Type&q ...