Python 入门基础15 --常用模块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的日志级别
s6)tream:用指定的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  :日志文件

猜你喜欢

转载自www.cnblogs.com/xt12321/p/10692403.html