首页 > 其他 > 详细

包,logging日志模块,copy深浅拷贝

时间:2019-07-20 09:11:36      阅读:81      评论:0      收藏:0      [点我收藏+]

一 包 package

包就是一个包含了 __init__.py文件的文件夹

包是模块的一种表现形式,包即模块

首次导入包:

  先创建一个执行文件的名称空间

    1.创建包下面的__init__.py文件的名称空间

    2.运行包下面的__init__,py文件中的代码,将产生的名字放入放入包下面的__init__.py文件的名称空间

    3.在执行文件中拿到一个指向包下面的__init__.py文件名称空间

执行文件在 ‘  import 包名 ‘ 的时候拿到的是包下面 __init__.py 文件的名称空间的内容

在导入语句中,点号的左边都是文件夹

 

 相对导入:

  包下的py文件都是用来被导入的模块,所以可以在__init__.py里可以使用相对路径

绝对导入:

   缺点:当包的名字改动时,所有的导入语句都需要改动

技术分享图片

 

 技术分享图片

 

当你作为包的设计者来说
1.当模块的功能特别多的情况下 应该分文件管理
2.每个模块之间为了避免后期模块改名的问题 你可以使用相对导入(包里面的文件都应该是被导入的模块)

站在包的开发者 如果使用绝对路径来管理的自己的模块 那么它只需要永远以包的路径为基准依次导入模块
站在包的使用者 你必须得将包所在的那个文件夹路径添加到system path中(******)

python2如果要导入包 包下面必须要有__init__.py文件
python3如果要导入包 包下面没有__init__.py文件也不会报错
当你在删程序不必要的文件的时候 千万不要随意删除__init__.py文件

 二.logging日志模块

  日志分五个等级  默认打印到终端

logging.debug(调试日志debug) # 10
logging.info(消息info)  # 20
logging.warning(警告warn)  # 30
logging.error(错误error)  # 40
logging.critical(严重critical)  # 5

 

 

filename=‘日志文件的名字‘
formatter=‘日志信息的格式‘
datefmt=‘日志时间的格式‘
leve=10 # 日志级别 比10大的都执行,一般默认30
stream 是否打印到终端
ps :
1.日志文件默认以 a 模式写入
logging.basicConfig(filename=access.log,
                    format=%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s,
                    datefmt=%Y-%m-%d %H:%M:%S %p,
                    level=10,
                    # stream=True
                    )

 

‘‘‘日志使用流程步骤‘‘‘
1.logger 对象:负责生产日志
logger = logging.getLogger(日志名字)
2.filter 对象:过滤日志(了解)
3.handler 对象:控制日志输入出的位置(文件/终端)
hd1 = logging.FileHandler(文件名字,encoding=utf-8) # 输出到文件中
hd2 = logging.StreamHandler()  # 输出到终端
4.format 对象:规定日志内容的格式
fm1 = logging.Formatter(
            fmt=%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s,
            datefmt=%Y-%m-%d %H:%M:%S %p
)
fm2 = logging.Formatter(
            fmt=%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s,
            datefmt=%Y-%m-%d
5.给logging对象绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
6.给handler绑定formatter对象
hd1.setFormatter(fm1)
hd1.setFormatter(fm2) 
7.设置日志等级
logger.setLevel(10)
8.记录日志
logger.debug(logging日志模块)

 

log配置字典(模板)

技术分享图片
import os
import logging

# 格式 standard :  standard_format
standard_format = [%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]                   [%(levelname)s][%(message)s] #其中name为getlogger指定的名字
# 格式 simple : simple_format
simple_format = [%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s


# 定义日志输出格式 结束
"""
下面的两个变量对应的值 需要你手动修改
"""
logfile_dir = os.path.dirname(__file__)  # log文件的目录
logfile_name = a3.log  # log文件名

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

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

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)传递
        },  # 当键不存在的情况下 默认都会使用该k:v配置
    },
}
View Code

 

 

三.hashlib加密模块

应用场景:

  1.密码的密文存储

  2.校验文件内容是否一致  

密文算法越复杂,生成的密文越长
消耗的时间越长,占空间越大
通常用md5 就够了
明文转密文的顺序
md = hashlib.md5()  # 生成一个造密文的对象,算法是md5
# md.update(‘hello‘.encode(‘utf-8‘))  # 往对象里传明文数据 update 只能接受 bytes 类型的数据
md.update(bhello)  # 往对象里传明文数据 update 只能接受 bytes 类型的数据
print(md.hexdigest())  # 获取明文数据对应的密文
传入的内容 可以分多次传入 只要传入的内容相同 那么生成的密文肯定相同
md = hashlib.md5()
md.update(bareyouok?)
md.update(bare)
md.update(byou)
md.update(bok?)
print(md.hexdigest())  # 408ac8c66b1e988ee8e2862edea06cc7
# 408ac8c66b1e988ee8e286
加盐处理
import hashlib

def get_md5(data):
    md = hashlib.md5()
    md.update(加盐.encode(utf-8))
    md.update(data.encode(utf-8))
    return md.hexdigest()


password = input(password>>>:)
res = get_md5(password)
print(res)

 

 

四.copy深拷贝浅拷贝模块

import copy

l = [1,2,[1,2]]
# l1 = l
# print(id(l),id(l1))

#  浅拷贝
l1 = copy.copy(l)  # 拷贝一份 .......  浅拷贝
print(id(l),id(l1))  # 相同
l[0] = 222
print(l)  # [222, 2, [1, 2]]
print(l1)  # [1, 2, [1, 2]]
l[2].append(666)
print(l)  # [1, 2, [1, 2, 666]]
print(l1)  # [1, 2, [1, 2, 666]]


# 深拷贝
l1 = copy.deepcopy(l)
print(id(l),id(l1))  # 不同
l[2].append(666)
print(l)  # [1, 2, [1, 2, 666]]
print(l1)  # [1, 2, [1, 2]]

 

技术分享图片

 

 技术分享图片

 

包,logging日志模块,copy深浅拷贝

原文:https://www.cnblogs.com/waller/p/11216252.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!