Python 入门基础15 --shutil、shelve、log常用模块2、项目结构

今日内容:

一、常用模块 2019.04.10 更新

  • 1.time:时间
  • 2.calendar:日历
  • 3.datatime:可以运算的时间
  • 4.sys:系统
  • 5.os:操作系统
  • 6.os.path:系统路径操作
  • 7.random:随机数
  • 8.json:序列化
  • 9.pickle:序列化

二、常用模块2 2019.04.11 更新

  • 1.shutil:可以操作权限的处理文件模块
  • 2.shelve:可以用字典存取数据到文件
  • 3.标准输入输出错误流
  • 4.日志模块
  • 5.项目开发结构

1.shutil:可以操作权限的处理文件模块

import shutil
# ----------------------------------
# 基于路径的文件复制
# 拷贝文件的格式:(参数列表:目标源文件,目的地址文件)
# 拷贝文件无返回值,直接在目录里面出现新的文件 shutil.copyfile('aa.txt', 'bb.txt') # ----------------------------------
# 基于流的文件复制
# 语法就是,两个open ,第一个是读源文件,第二个是写到新文件中
# 通过shutil.copyfileobj(r, w)完成操作 with open('aa.txt', 'rb') as r, open('cc.txt', 'wb') as w:
shutil.copyfileobj(r, w) # ----------------------------------
# 递归删除目标目录
# 很干脆,一删全没了,全没了
# 参数是 目标目录的地址 shutil.rmtree('to_del') # ----------------------------------
# 文件移动
# shutil.move(src,dst)
# 参数:第一个而是要移动的文件,第二个是目的地址路径 shutil.move('aa.txt', 'to_del') # ----------------------------------
# 文件夹压缩
# shutil.make_archive(base_name, format) # 目标文件,压缩格式 # shutil.make_archive('aa.txt', 'tar') # ----------------------------------
# 文件夹解压
# 第一个参数:文件名 ,后面的参数可以不填
# unpack_archive(filename, extract_dir=None, format=None) shutil.unpack_archive('aa.txt.zip')

2.shelve:可以用字典存取数据到文件

import shelve
# ----------------------------------
# 将序列化文件操作dump与load进行封装
# 注:writeback允许序列化的可变类型,可以直接修改值
# ---------------------------------- # 后面的writeable表示,在更改内存里面的数据的同时,更新文件里面的数据
# s_dic = shelve.open("target_file", writeback=True) s_dic = shelve.open("2.py") # ----------------------------------
# 序列化:存
print(s_dic) # 当点亮writeback的时候,可以更新文件里面的值
# s_dic['key1'] = 'value1'
# s_dic['key2'] = 'value2' # ----------------------------------
# 反序列化:取
print(s_dic['key1']) # ----------------------------------
# 文件这样的释放
s_dic.close()

3.标准输入输出错误流

import sys
# ----------------------------------
# print默认是对sys.stdout.write('msg') + sys.stdout.write('\n')的封装
# 格式化结束符print:print('msg', end='')
# 输出,
sys.stdout.write('msg') # 输出 error 格式的 message
sys.stderr.write('msg') # 读取输入一行的内容
msg = sys.stdin.readline()
print(msg) # 上面所有的内容打印的东西:
# 451ihi # 输入的内容
# msgmsg451ihi # 异步执行,不知道打印先后顺序

4.日志模块

4.1 logging:日志模块
1) root logging的基本使用:五个级别
2)root logging的基本配置:logging.basicConfig()
3)logging模块四个核心:Logger | Filter | Handler | Formater
4)logging模块的配置与使用
-- 配置文件:LOGGING_DIC = {}
-- 加载配置文件:logging.config.dictConfig(LOGGING_DIC) => logging.getLogger('log_name')
4.2 日志级别
    NOTSET : 0  # 不设置
DEBUG : 10
INFO : 20
WARNING: 30 # WARN = WARNING
ERROR : 40
CRITICAL:50 # FATAL = CRITICAL 默认级别为warning,默认打印到终端
# 测试打印不同级别的log
import logging
logging.debug("调试 debug")
logging.info("信息 info")
logging.warning("警告 warn")
logging.error("错误 error")
logging.critical("严重 critical")
logging.warning("--------------------华丽分割线--------------------------") # 默认情况下,设置的级别为warning,所以debug和info的信息是打不出来的
# 类型 用户 内容
# 打印结果:
'''
WARNING:root:警告 warn
ERROR:root:错误 error
CRITICAL:root:严重 critical
'''
4.3 配置logging.basicConfig()函数
# 为logging模块指定全局配置,针对所有logger有效,控制打印到文件中

在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为,可用参数有

'''
1) filename:指定的文件创建FiledHandler(句柄)
2) filemode:文件打开方式,在指定了filename时会使用这个参数,默认值为'a'还可以为'w'
3) format:指定handler使用的日志显示格式
4) datefmt:指定日期时间格式
5) level:设置rootlogger的日志级别
6) stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。
若同时列出了filename和stream两个参数,则stream参数会被忽略。 '''
4.4 format格式关键字
# 格式:
%(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:字符串形式的当前时间。默认格式是'2019-04-11 16:49:45,896'。逗号后面的是毫秒
%(thread)d:线程ID。可能没有
%(threadName)s:线程名。可能没有
%(process)d:进程ID。可能没有
%(message)s:用户输出的消息
4.5 测试定制格式输出log
import logging
logging.basicConfig(
filename='test.log',
format='%(levelname)s: %(asctime)s - %(filename)s -%(module)s : %(message)s ',
datefmt='%Y - %m - %d %H:%M:%S',
level=10
)
logging.debug("调试 debug")
logging.info("信息 info")
logging.warning("警告 warn")
logging.error("错误 error")
logging.critical("严重 critical") # -----------------------------------------------
# 打印结果:
# 此处由于设置了level为10,所以才能打印出了五条信息 DEBUG: 2019 - 04 - 11 16:05:04 - log模块.py -log模块 : 调试 debug
INFO: 2019 - 04 - 11 16:05:04 - log模块.py -log模块 : 信息 info
WARNING: 2019 - 04 - 11 16:05:04 - log模块.py -log模块 : 警告 warn
ERROR: 2019 - 04 - 11 16:05:04 - log模块.py -log模块 : 错误 error
CRITICAL: 2019 - 04 - 11 16:05:04 - log模块.py -log模块 : 严重 critical
4.6 log文件配置
# ------------日志的四个对象---------------
1) logger:产生日志的对象
2) Filter:过滤日志的对象
3) Handler:接收日志,然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端
4) Formatter对象:可以定制不同的日志格式对象,然后给不同的Handler对象使用,以此来控制不同的Handler的日志格式 # ------------详细配置过程-------------------- import logging # 1.logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出
logger = logging.getLogger(__file__) # 2.Filter对象:不常用 # 3.Handler对象:接收logger传来的日志,然后控制输出
h1 = logging.FileHandler('t1.log') # 打印到文件
h2 = logging.FileHandler('t2.log') # 打印到文件
h3 = logging.StreamHandler() # 打印到终端 # 4.Formatter对象:日志格式
formater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',\
datefmt='%Y-%m-%d %H:%M:%S %p')
formater2 = logging.Formatter('%(asctime)s : %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p')
formater3 = logging.Formatter('%(%(name)s : %(message)s') # 5.为Handler对象绑定格式
h1.setFormatter(formater1)
h2.setFormatter(formater2)
h3.setFormatter(formater3) # 6.将Handler添加给logger并设置日志级别
logger.addHandler(h1)
logger.addHandler(h2)
logger.addHandler(h3)
logger.setLevel(10) #7、测试
logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')
4.7 常用模板
import logging

# 其中name为getlogger指定的名字
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
logfile_path = "配置文件路径" LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {},
'handlers': {
# 打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
# 打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024 * 1024 * 5, # 日志大小 5M
'backupCount': 5, # 日志文件最大个数
'encoding': 'utf-8', # 日志文件的编码
},
},
'loggers': {
# logging.getLogger(__name__)拿到的logger配置
'aa': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
},
},
}

5.项目开发结构

--ATM
--bin : 存放可执行文件,项目的入口
--conf :存放项目的配置信息
--core :存放项目的核心代码
--db :数据处理相关的代码
--lib :库,存放公共模块
--log :日志文件
上一篇:从零开始:Mysql基于Amoeba的集群搭建


下一篇:基于k8s的集群稳定架构-转载