模块( hashlib模块 configparse模块 logging模块)

Posted python052044

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块( hashlib模块 configparse模块 logging模块)相关的知识,希望对你有一定的参考价值。

hashlib模块

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似。

如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:

SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。

技术分享图片
md5_obj = hashlib.md5()
md5_obj.update(baaabbb)
res = md5_obj.hexdigest()
print(res)  #6547436690a26a399603a7096e876a2d

md5_obj = hashlib.md5()
md5_obj.update(baa)
md5_obj.update(babbb)
res = md5_obj.hexdigest()
print(res)  #6547436690a26a399603a7096e876a2d
View Code
技术分享图片
with open(userinfo,rb) as f:
    md5_obj = hashlib.md5()
    for line in f:
        md5_obj.update(line)   # update操作可以在hexdigest之前执行多次
                               # 分次对一个长字符串进行摘要
    res = md5_obj.hexdigest()  # 结果是对整个长字符串的摘要结果
    print(res)
检验文件一致性
技术分享图片
加盐
md5_obj = hashlib.md5(.encode(utf-8))
# md5算法的对象
md5_obj.update(balex3714)  # 使用md5摘要算法对‘alex3714‘进行摘要
res = md5_obj.hexdigest()   # 获取摘要之后的结果
print(res,type(res))
aee949757a2e698417463d47acac93df    32位
0e249b9c16ea1d840ce700587cada978
加盐
技术分享图片
动态加盐  _ 校园管理系统
username = alex   # alex alex3714
                    # egon egon5068
md5_obj = hashlib.md5(username.encode(utf-8)+.encode(utf-8))
md5_obj.update(balex3714)
res = md5_obj.hexdigest()
print(res)
动态加盐

configparser模块

该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。

创建文件

技术分享图片
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
  
[bitbucket.org]
User = hg
  
[topsecret.server.com]
Port = 50022
ForwardX11 = no
常见文档
技术分享图片
import configparser

config = configparser.ConfigParser()

config["DEFAULT"] = {ServerAliveInterval: 45,
                      Compression: yes,
                     CompressionLevel: 9,
                     ForwardX11:yes
                     }

config[bitbucket.org] = {User:hg}

config[topsecret.server.com] = {Host Port:50022,ForwardX11:no}

with open(example.ini, w) as configfile:

   config.write(configfile)
python生成的文档

查找文件

技术分享图片
import configparser

config = configparser.ConfigParser()

#---------------------------查找文件内容,基于字典的形式

print(config.sections())        #  []

config.read(example.ini)

print(config.sections())        #   [‘bitbucket.org‘, ‘topsecret.server.com‘]

print(bytebong.com in config) # False
print(bitbucket.org in config) # True


print(config[bitbucket.org]["user"])  # hg

print(config[DEFAULT][Compression]) #yes

print(config[topsecret.server.com][ForwardX11])  #no


print(config[bitbucket.org])          #<Section: bitbucket.org>

for key in config[bitbucket.org]:     # 注意,有default会默认default的键
    print(key)

print(config.options(bitbucket.org))  # 同for循环,找到‘bitbucket.org‘下所有键

print(config.items(bitbucket.org))    #找到‘bitbucket.org‘下所有键值对

print(config.get(bitbucket.org,compression)) # yes       get方法Section下的key对应的value
View Code

增删改操作

技术分享图片
import configparser

config = configparser.ConfigParser()

config.read(example.ini)

config.add_section(yuan)



config.remove_section(bitbucket.org)
config.remove_option(topsecret.server.com,"forwardx11")


config.set(topsecret.server.com,k1,11111)
config.set(yuan,k2,22222)

config.write(open(new2.ini, "w"))
View Code

logging模块

操作日志的模块
什么叫日志
    给用户看的
        用户的重要行为
            登录 涉及安全
            账单 钱
    给开发和运维和测试人员看的
        自测   logging.debug(一些中间结果)
        测试   1++++++1
        运维
    记录
        打印在屏幕上
        写入文件里
    logging的优势
        格式更加规范
        等级更加鲜明

简单的配置应用

import logging
logging.basicConfig(level=logging.ERROR,  #
                    format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s,
                    datefmt=%a, %d %b %Y %H:%M:%S,
                    filename=test.log,
                    filemode=a)
logging.debug(debug message)  # 调试
logging.info(info message)    # 信息
logging.warning(warning message)  # 警告
logging.error(error message)      # 错误
logging.critical(critical message)  # 严重错误
使用logger对象的用法
技术分享图片
import logging
# 首先创建一个logger对象
logger = logging.getLogger()

#创建一个格式
fmt = logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)

# 创建一个 文件句柄 控制向哪个文件中输出 用什么格式
fh = logging.FileHandler(test3.log,encoding=utf-8)
fh.setFormatter(fmt)

# 创建一个 屏幕句柄 控制向屏幕输出 用什么格式
sh = logging.StreamHandler()
sh.setFormatter(fmt)

# 将logger对象和文件句柄,屏幕句柄绑在一起
logger.addHandler(fh)
logger.addHandler(sh)
logger.setLevel(logging.DEBUG)     # 首先必须要整体对logger进行设置
sh.setLevel(logging.INFO)
fh.setLevel(logging.WARNING)
logger.debug(logger debug message)
logger.info(logger info message)
logger.warning(logger warning message)
logger.error(logger error message)
logger.critical(logger critical message)
View Code

三级菜单

技术分享图片
menu = {
    北京: {
        海淀: {
            五道口: {
                soho: {},
                网易: {},
                google: {}
            },
            中关村: {
                爱奇艺: {},
                汽车之家: {},
                youku: {},
            },
            上地: {
                百度: {},
            },
        },
        昌平: {
            沙河: {
                老男孩: {},
                北航: {},
            },
            天通苑: {},
            回龙观: {},
        },
        朝阳: {},
        东城: {},
    },
    上海: {
        闵行: {
            "人民广场": {
                炸鸡店: {}
            }
        },
        闸北: {
            火车战: {
                携程: {}
            }
        },
        浦东: {},
    },
    山东: {},
}
# 队列 先进先出
# 栈   先进后出
    # 压栈

# l = [menu]
# while l:
#     menu = l.pop()
#     for key in menu:
#         print(key)
#     inp_key = input(‘>>>‘)
#     if inp_key in menu and menu[inp_key]:
#         l.append(menu[inp_key])

l = [menu]
while l:
    for key in l[-1]:print(key)
    k = input(input>>).strip()   # 北京
    if k in l[-1].keys() and l[-1][k]:
        l.append(l[-1][k])
    elif k == b:l.pop()
    elif k == q:break
三级菜单堆栈

 

以上是关于模块( hashlib模块 configparse模块 logging模块)的主要内容,如果未能解决你的问题,请参考以下文章

hashlib,configparser,logging模块

Python基础-configparser和hashlib模块

picklejson,configparser,hashlib模块

python模块: hashlib模块, configparse模块, logging模块

configparser ,shelve ,hashlib,random模块

模块( hashlib模块 configparse模块 logging模块)