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('年', '月', '日')
格式化时间的多种用法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
%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]) # 2019
print(struct_time.tm_year) # 2019
时间戳与结构化时间之间的转换:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 格式化时间 ----> 结构化时间 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)
计算时间差:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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模块
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
日志:
开发中的日志:
1、日志帮助你调试代码
2、代码的警告,危险提示作用
3、你对服务器的操作命令
4、重要的节点,需要日志提示。
logging的,低,中,高,配
低配:
值打印到屏幕
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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('输入非数字元素,警告!')
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
中配
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
标配 # 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
高配
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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期day14logstaff.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()