模块之shutil、shelve、configparser、logging等相关内容-22

1.shutil 模块

import shutil

# shutil.move('aaa','eee') #如果不存在eee文件夹,且在同目录下,将aaa改名至eee

# shutil.move('eee','bbb') # 如果有bbb文件夹,将eee移动至bbb文件夹

# 压缩
res = shutil.make_archive(r'C:UsersUsherDesktop全栈15期day22压缩包','gztar',root_dir=r'C:UsersUsherDesktop全栈15期day22')
# 括号中的元素 第一个是压缩后压缩包的名字,第二个是压缩格式,第三个是需要压缩的文件夹


# 解压

res = shutil.unpack_archive(r'压缩包.tar.gz','bbb','gztar')
# 括号中的元素 第一个是需要解压的文件的路径,第二个是需要解压到的文件目录,第三个是格式

### 总结
import shutil
shutil.make_archive(压缩后的名字及路径,压缩格式,需要压缩的文件路径)
shutil.unpack_archive(需要解压的文件路径,解压到的文件目录,解压格式)

import tarfile

# 此方式为解压
t=tarfile.open('压缩包.tar.gz','r')
# 括号中的元素 第一个是需要解压的压缩包 第二个是读取方式
t.extractall('.')
# 括号中写的是需要解压到的路径,如果是本文件夹下就是'.'
t.close()

2.shelve 模块

import shelve

# 序列化用 python专用 格式 .shl 通过字典的方式序列化

f = shelve.open('db.shl')

f['info'] ={'name':'egon','age':18}

print(f['info'])
# {'name': 'egon', 'age': 18}
print(f['info']['name'])
# egon

f.close()

3.configparser 模块

import configparser
# 此模块为调用查看配置文件所用

config = configparser.ConfigParser()
config.read('cfg.ini') # 配置文件在下方

res = config.sections() # 查看配置标题
print(res)
# ['log']

res = config.options('log') # 按照标题查看键值对中的键
print(res)
# ['v']

res = config.items('log') # 按照标题查看键值对
print(res)
# [('v', '1')]

res = config.get('log','v') # 按照标题和键值对中的键获取键值对中的值
print(res,type(res))
# 1 <class 'str'>

res1 = config.getint('log','v') # 键值对的值可以直接被获取成为数字,浮点数和布尔值类型
res2 = config.getfloat('log','v')
res3 = config.getboolean('log','v')
print(res1,type(res1))
# 1 <class 'int'>
print(res2,type(res2))
# 1.0 <class 'float'>
print(res3,type(res3))
# True <class 'bool'>
# cfg.ini

[log]
v=1

4.logging 模块

import logging

# # # 一:日志配置   基础的日志配置
# logging.basicConfig(
#     # 1、日志输出位置:1、终端 2、文件
#     filename='access.log', # 不指定,默认打印到终端
#
#     # 2、日志格式
#     format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
#               时间           日志名称     提示级别       调用日志输出的模块名称   日志内容
#
#     # 3、时间格式
#     datefmt='%Y-%m-%d %H:%M:%S %p',
#
#     # 4、日志级别
#     # critical => 50
#     # error => 40
#     # warning => 30
#     # info => 20
#     # debug => 10
#     level=30,

#
# logging.debug('1111')
# logging.info('2222')
# logging.warning('33333')
# logging.error('4444')
# logging.critical('5555')
# #

# 二、日志配置字典   常用字典方法配置   settings文件在下方
import logging.config
import settings

logging.config.dictConfig(settings.LOGGING_DIC)
logger1 = logging.getLogger('用户信息') # 此括号内的元素 为 日志格式中 %(name)s 项目
logger1.info('这是日志的真正内容')

logger2 = logging.getLogger('如果日志配置字典(settings.LOGGING_DIC[“loggers”])中没有本项目,就使用“ ”的哪一个条目,相当于日子名称变更,但是内容不变')
logger2.info('这是日志的真正内容')
# settings.py

"""
logging配置
"""

import os

# 1、定义三种日志输出格式,日志中可能用到的格式化串如下
# %(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用户输出的消息

# 2、强调:其中的%(name)s为getlogger时指定的名字
#### # # logger1=logging.getLogger('用户交易') 此句为调用日志输出函数的文件中(模块)所有,仅展示
standard_format = '%(asctime)s - %(name)s - %(filename)s:%(lineno)d - %(levelname)s - %(message)s'
# 此日志格式可以自定义

simple_format = '%(asctime)s - %(levelname)s - %(message)s'

# test_format = '%(asctime)s] %(message)s'

# 3、日志配置字典
LOGGING_DIC = {
   'version': 1, #暂时不管
   'disable_existing_loggers': False, #暂时不管
   # 下方为日志格式 formatters 可以有多个
   'formatters': {
       # 此大字典的键值对中的键可以为任意值,值为实际配置 standard / simple
       'standard': {
           # 字典中键值对的键为固定搭配,不可修改,值为之前设置的日志格式
           'format': standard_format
      },
       'simple': {
           'format': simple_format
      },
  },
   'filters': {},
   # 下方为日志输出位置 handlers 可以有多个
   'handlers': {
       #打印到终端的日志
       # 此大字典的键值对中的键可以为任意值,值为实际配置 console / file1 / file2
       'console': {
           # # 字典中键值对的键为固定搭配,不可修改,值为之前设置的日志配置
           'level': 'DEBUG',
           'class': 'logging.StreamHandler',  # 打印到屏幕
           'formatter': 'simple'
      },
       #打印到文件的日志,收集info及以上的日志
       'file1': {
           'level': 'DEBUG',
           'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,日志轮转
           'formatter': 'standard',
           # 可以定制日志文件路径
           # BASE_DIR = os.path.dirname(os.path.dirname(__file__)) # log文件的目录
           # LOG_PATH = os.path.join(BASE_DIR,"log",'a1.log')
           'filename': 'a1.log',  # 日志文件
           'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M   单位都是字节 每到这个大小就进行一次轮转(产生新文件)
           'backupCount': 5, # 最多轮转的次数,超过此次数最早的文件就被删掉了
           'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
      },
       'file2': {
           'level': 'DEBUG',
           'class': 'logging.FileHandler',  # 保存到文件
           'formatter': 'standard',
           'filename': 'a2.log',
           'encoding': 'utf-8',
      },
  },
   # 下方为日志的配置 loggers 可以有多个
   'loggers': {
       #logging.getLogger(__name__)拿到的logger配置
       # '': {
       #     'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
       #     'level': 'DEBUG', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
       #     'propagate': False, # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
       # },
       '用户交易': {
           'handlers': ['file1','console'],
           'level': 'DEBUG',
           'propagate': False,
      },
       '': {
           'handlers': ['file1','console'],
           'level': 'DEBUG',
           'propagate': False,
      },

  },
}

 

原文地址:https://www.cnblogs.com/usherwang/p/13413543.html