hashlib模块,configparse模块,logging模块
#################hashlib加密模块############################
#登陆 md5 sha
#密码不能用使用文字存储
#密文存储 摘要算法
#校验文件的一致性, md5
#网络的上传下载功能
#保证多台服务器状态
#摘要算法:
import hashlib
#
has = hashlib.md5()
has.update(b'xx169..')# 使用md5摘要算法对'alex3714'进行摘要
ret = has.hexdigest() #获取摘要之后的结果
print(ret) #538fced34767a51934e1ebdc2e841da4
#
user = input('user:')
passwd = input('passwd:')
md5 = hashlib.md5()
md5.update(passwd.encode('utf-8'))
passwd = md5.hexdigest()
if user =='alex' and passwd == '538fced34767a51934e1ebdc2e841da4':
print('登陆成功')
else:
print('密码错误')
md51 = hashlib.sha1()
#sha算法
md51.update(b'alex114') #使用sha1 摘要算法对'alex114'进行摘要
ret = md51.hexdigest() #获取摘要到的结果
print(ret) #结果==837db908c104b4818ef0289cdf049adeb5b85673
md5_obj = hashlib.md5() md5_obj.update(b'aaabbb') res = md5_obj.hexdigest() print(res) #6547436690a26a399603a7096e876a2d md5_obj = hashlib.md5() md5_obj.update(b'aa') md5_obj.update(b'abbb') res = md5_obj.hexdigest() print(res) #6547436690a26a399603a7096e876a2d 相同的字符串使用相同的选法 在任何时候 得到的结果都是一致的
只要在res = md5_obj.hexdigest()这个之前的摘要出来的值都是一样
#加盐算法
# mdl = hashlib.md5('xx169..'.encode('utf-8')+'xx169..'.encode('utf-8'))
# mdl.update(b'xzx199669..') #给这个字符串密码摘要出来的加上'盐'的
# res = mdl.hexdigest()
# print(res) #加盐后 == 9db2029ebe5d89a2948232db4760f917
# #加盐进阶 409c14adcdd9e6ca7344d4b3b6f9b1b2
user = input('user:')
passwd = input('passwd:')
md2 = hashlib.md5(passwd.encode('utf-8')+passwd.encode('utf-8')) #动态双重加盐
md2.update(b'xzx16..')
passwd = md2.hexdigest()
if user == 'alex' and passwd =='6e0ba85efb3a9ecce7398136471ed425':
print('ok')
else:
print('no')
import hashlib
md5_obj = hashlib.md5()
# md5算法的对象
md5_obj.update(b'xz69..') # 使用md5摘要算法对'alex3714'进行摘要
res = md5_obj.hexdigest() # 获取摘要之后的结果
print(res,type(res)) #538fced34767a51934e1ebdc2e841da4 32位
#校验文件的一致性
with open('sha1.log','rb')as f:
md2 = hashlib.md5('sex'.encode('utf-8')) #文化也可以实行加盐
md2.update(f.read())
r1 = md2.hexdigest()
print(r1) #sha1.log的摘要是==9b517904a0281546ef51a0205e949358 and 加盐==cac879244551bc96359e002a8f967a22
# #校验文件放法2
#
with open('sha1.log','rb')as f:
md2 =hashlib.md5('sex'.encode('utf-8')) #文件加盐后
for line in f:
md2.update(line) ## update操作可以在hexdigest之前执行多次
#分次对一个长字符串进行摘要
r2 = md2.hexdigest()
print(r2) #cac879244551bc96359e002a8f967a22
#hashlib.sh1()的摘要
ha = hashlib.sha1()
ha.update(b'xzx1966')
ret1 = ha.hexdigest()
print(ret1)
#################configparser。init类文件操作#################
####################configparser。init类文件操作############################
####################configparser。init类文件操作############################
#可以当作一个字典的方式来操作
#######写入#######
import configparser
config =configparser.ConfigParser() #config 创建这个对象用来操作文件
#给config 这个对象写入组 和成员
config['DEFAULT'] ={'server':'45','Compression':'yes','Comperssionlevel':'9','Forwardell':'ok'}
config['bitbucket.org'] ={'user':'hg'}
config['Topsecret.server.com'] = {'host':'25000','Forwardell':'no'}
with open('example.ini', 'w') as configfile: #打开example.ini这个文件后w写入
config.write(configfile) #给config 这个对象把 configfile文件句柄传入禁区
##############
########读取文件内容#########
import configparser
configr= configparser.ConfigParser
config.read('example.ini')
print(config.sections()) #查看config这个组中的成员信息 但是看不到DEFAULT里面的需要另一个办法
print('Topsecret.server.com' in config) #判断一个祖名是否在config这个对象的大组里面,返回True, False
print(config['DEFAULT']['server']) #取DEFAULT这个关键字组中成员对于的值 相当于字典的value
print(config['Topsecret.server.com']['host']) #查看祖名,组成员的对于值
# print(config['bitbucket.org']) #输出结果==<Section: bitbucket.org> 查看一个组他是一个可迭代的组 所以得for一下
for i in config['bitbucket.org']: #循环 config这个对象中['bitbucket.org'] 这个组是个可迭代的 返回了成员等号左边的key
print(i)
# print(config.options('Topsecret.server.com'))
# print(config.items('Topsecret.server.com')) #返回一个列表套元祖的 字典键值对
print(config.get('Topsecret.server.com','host')) #get 方法去 一个组名中取组成员key的值
###增删改查########
import configparser #导入模块
confi = configparser.ConfigParser() #写入模块规范
confi.read('example.ini') #读取example。ini这个文件
confi.add_section('yuan') #给config这个大字典加入一个"yuan"组
confi.remove_option('bitbucket.org')
confi.remove_option('Topsecret.server.com','forwardell')
#################loging日志模#####################
用于便捷记录日志且线程安全的模块
日志等级:
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
只有【当前写等级】大于【日志等级】时,日志文件才被记录。
# 定义文件
file_1_1 = logging.FileHandler('l1_1.log', 'a', encoding='utf-8')
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")
file_1_1.setFormatter(fmt)
file_1_2 = logging.FileHandler('l1_2.log', 'a', encoding='utf-8')
fmt = logging.Formatter()
file_1_2.setFormatter(fmt)
# 定义日志
logger1 = logging.Logger('s1', level=logging.ERROR)
logger1.addHandler(file_1_1)
logger1.addHandler(file_1_2)
# 写日志
logger1.critical('1111')
# 定义文件
file_2_1 = logging.FileHandler('l2_1.log', 'a')
fmt = logging.Formatter()
file_2_1.setFormatter(fmt)
# 定义日志
logger2 = logging.Logger('s2', level=logging.INFO)
logger2.addHandler(file_2_1)
- 当使用【logger1】写日志时,会将相应的内容写入 l1_1.log 和 l1_2.log 文件中
- 当使用【logger2】写日志时,会将相应的内容写入 l2_1.log 文件中
操作longing日志列子:
#logging记录代码日志模块
logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别,当然,也可以通过fh.setLevel(logging.Debug)单对文件流设置某个级别
import logging
#
logger = logging.getLogger()
#当前时间 #当前模块名 #当等级 当前信息
fm = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#创建一个文件句柄 控制向那个文件中输出,用什么格式,以及等级
fh = logging.FileHandler('sha1.log',encoding='utf-8')
fh.setFormatter(fm)
#创建一个屏幕句柄 控制向屏幕输出 用什么格式 等级
sh = logging.StreamHandler() #向屏幕输出
sh.setFormatter(fm) #让屏幕输出和文件输出放在一起
#将logger对象文件句柄和屏幕句柄绑定在一起
logger.addHandler(fh)
logger.addHandler(sh)
logger.setLevel(logging.INFO) #只输出info以上加info4个信息 debug不显示
logger.debug('1 logger debug message') #调试自用
logger.info('2 logger info message') #信息
logger.warning('3 logger warning nessage') #警告
logger.error('4 logger error message') #错误
logger.critical('5 logger critical message') #严重错误