#################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‘) #严重错误
原文地址:https://www.cnblogs.com/jsp0/p/8571073.html
时间: 2024-10-11 11:27:05