常见内置模块以及方法

一:logging模块#

(1)日志模块

  (1)debug:调试信息

  (2)info: 程序运行输出的信息

  (3)warning:程序告警信息

  (4)error:程序错误信息

  (5)critical:严重错误

 

(2)日志等级:

  (1)debug:level = 10

  (2)info: level = 20

  (3)warni:level = 30

  (4)error:level = 40

  (5)critical:level = 50

 

(3)打印方式:

  (1)默认为打印到终端:默认打印到终端

  (2)打印实例

复制代码
logging.debug('打印debug')
logging.info('打印info')
logging.warning('打印warning')
logging.error('打印报错')
logging.critical('打印严重错误')

'''
WARNING:root:打印warning
ERROR:root:打印报错
CRITICAL:root:打印严重错误

'''
打印实例
复制代码

PS:输出信息只能输出等级比自己大的 例如warning默认为30 其只能打印(30-50)

 

(4)logging模块的常规参数:

复制代码
可在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。 
datefmt:指定日期时间格式。 
level:设置rootlogger(后边会讲解具体概念)的日志级别 
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。



#格式
%(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:用户输出的消息
logging模块的常规配置
复制代码

配置实例:

复制代码
logging.basicConfig(filename='access.log', # 设置接收文件
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s', # 文件格式
                    datefmt='%Y-%m-%d %H:%M:%S %p', # 文件时间 %p 显示上下午
                    level=10) # 日志等级

logging.debug('调试debug')
logging.info('消息info')
logging.warning('警告warn')
logging.error('错误error')
logging.critical('严重critical')
配置实例
复制代码

 PS:不能同时在终端 以及文件中接收日志 且在文件中日志会乱码 因为pycharm默认使用utf-8编码 而保存到文件夹中以自己系统为编码格式

例如:

复制代码
logging.basicConfig(filename='access.log', # 设置接收文件
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s', # 文件格式
                    datefmt='%Y-%m-%d %H:%M:%S %p', # 文件时间 %p 显示上下午
                    level=10, # 日志等级
                    stream = sys.stdout)  # 输出到终端
                                        # ValueError: 'stream' and 'filename' should not be specified together

logging.debug('调试debug')
logging.info('消息info')
logging.warning('警告warn')
logging.error('错误error')
logging.critical('严重critical')

'''
2019-07-19 20:01:40 PM - root - DEBUG -day17:  ����debug
2019-07-19 20:01:40 PM - root - INFO -day17:  ��Ϣinfo
2019-07-19 20:01:40 PM - root - WARNING -day17:  ����warn
2019-07-19 20:01:40 PM - root - ERROR -day17:  ����error
2019-07-19 20:01:40 PM - root - CRITICAL -day17:  ����critical
 '''
错误情形
复制代码

 

(5)logging的四种对象

  (1)logger:产生日志的对象

  (2)Filter:过滤日志

  (3)handler:处理日志输出(终端/文件输出)

  (4)Formatter:定制日志的格式

图解:

例如:

复制代码
# 产生日志
logger1 = logging.getLogger('产生日志名称')

# 处理日志
fh1 = logging.FileHandler( filename = 'a1.log',encoding='utf-8') # 打印到文件
fh2 = logging.StreamHandler()                                    # 打印到终端

# 日志格式

for1 = logging.Formatter(
fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p'
)

for2 =  logging.Formatter(
fmt='%(asctime)s ',
datefmt='%Y-%m-%d %H:%M:%S %p'
)

# 建立日志对文件的处理方式

logger1.addHandler(fh1) # 对文件打印
logger1.addHandler(fh2) # 对终端打印

# 建立格式与文件的处理关系
fh1.setFormatter(for1)
fh2.setFormatter(for2)

# 设置等级
logger1.setLevel(10)

logger1.debug('调试信息')
loggin模块基本顺序
复制代码

 

(6)logging模块应用:

复制代码
"""
logging配置
"""

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'

id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'

# 定义日志输出格式 结束

logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目录

logfile_name = 'all2.log'  # log文件名

# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir):
    os.mkdir(logfile_dir)

# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name)

# log配置字典
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',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    'loggers': {
        #logging.getLogger(__name__)拿到的logger配置
        '': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG',
            'propagate': True,  # 向上(更高level的logger)传递
        },
    },
}


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()

logging配置文件
logging模块应用
复制代码

 

二:hashlib模块#

摘要算法:MD5 sha

特点:

(1)不定长输入 定长输出

(2)不能通过散列值 反向逆推原文件

(3)文件只要稍微被修改一点 散列值会发生巨大变化

PS:

(1)MD5 128bit

(2)sha1 160bit

 

作用:

(1)数据进行加密

(2)检验文件是否被篡改

 

使用方式:

复制代码
import hashlib

md = hashlib.md5()

md.update('hello') # 必须是二进制 Unicode-objects must be encoded before hashing
print(md.hexdigest())

md_5 = hashlib.md5()
md_5.update(b'hello')
print(md_5.hexdigest()) # 5d41402abc4b2a76b9719d911017c592
复制代码

 

小特点:

(1)传入数据可以分多次传入 只要传入内容相同 散列值不变

md5 = hashlib.md5()
md5.update(b'how to use md5 in python hashlib?')
print(md5.hexdigest()) # d26a53750bc40b38b65a520292f69306

md5 = hashlib.md5()
md5.update(b'how to use md5 in ')
md5.update(b'python hashlib?')
print(md5.hexdigest()) # d26a53750bc40b38b65a520292f69306

 

加盐:

作用:在真正数据之前在封装一层md5算法值 防止被状况

例如:

md5 = hashlib.md5()
md5.update(b'SR') # 加盐
md5.update(b'how to use md5 in python hashlib?') # d26a53750bc40b38b65a520292f69306 真实的散列值
print(md5.hexdigest()) # 362f3a336c2d7cb652e83e6289a73eda 伪装之后的散列值

 

总结:

(1)算法长度越长 散列值越南被破解

(2)加密速度相对较慢 占用内存资源比较多

 

三:openpyxl#

作用:操作excel表格

 

操作方式一

写表格(xlwd):

例如:

复制代码
from openpyxl import Workbook

wb = Workbook()                   # 先生成一个工作簿
wb1 = wb.create_sheet('index',0)       # 创建一个表单页  后面可以通过数字控制位置
wb2 = wb.create_sheet('index1')
wb1.title = 'login'                # 后期可以通过表单页对象点title修改表单页名称

wb1['A3'] = 666
wb1['A4'] = 444
wb1.cell(row=6,column=3,value=88888888) # 6行3列 值
wb1['A5'] = '=sum(A3:A4)'               # 求和
wb.save('test.xlsx')                    # 报错

wb1.append(['username','age','hobby'])  # 添加表格名称
 
复制代码

 

操作方式二:

读表格(xlrt)

例如:

wb = load_workbook('test.xlsx',read_only=True,data_only=True) 
print(wb)
print(wb.sheetnames)  # ['login', 'Sheet', 'index1'] 查看表单的名字
print(wb['login']['A3'].value)   #  取值

 

四:深浅拷贝

(1)作用:复制

例如:

l = [1,2,[1,2]]

l1 = 1

print(id(l),id(l1)) # 44778696 500657632

图解:

 

 

(2)分类:

  (1)浅拷贝

例如:

复制代码
import copy

l = [1,2,[1,2]]

l1 = copy.copy(l)

l[2].append(666)

print(l)  # [1, 2, [1, 2, 666]]
print(l1) # [1, 2, [1, 2, 666]]
复制代码

图解:

PS:

(1)其指向容器类型的外层,即都是共用一个容器

(2)如果内部含有可变类型,因为都是共用一个容器 其不会改变

(3)如果为不可变类型 如果原值改变 不会影响复制之后的 原值改变相当于将线断开 指向别的

 

  (2)深拷贝

 

复制代码
import copy

l = [1,2,[1,2]]

l1 = copy.deepcopy(l)

l[2].append(666)

print(l)  # [1, 2, [1, 2, 666]]
print(l1) # [1, 2, [1, 2, ]]
复制代码

图解:

 

 PS:

(1)深拷贝如果针对不可变类型 其会指向原有数据

(2)针对可变类型其会开辟一个新的容器类型

(3)因为自己新建一个 原有改变不影响

 

posted @   SR丶  阅读(396)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示
CONTENTS