1、配置相关的configparse模块

配置文件如何组织?python中常见的是将配置文件写成py,然后引入该模块即可。优点是方便访问。

但是也有用类似windows中的ini文件的配置文件,了解即可,这就是configparser模块。
该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。 1) 创建文件
 import configparser
config = configparser.ConfigParser()
config['DEFAULT'] = {
'ServerAliveInterval': '',
'Compression': 'yes',
'CompressionLevel': '',
'ForwardX11':'yes'
}
config['funyou.net'] = {'admin': 'funyou'} config['hongsun.com'] = {'Host port': '', 'Forward': 'True'} with open('config.ini', 'w', encoding='utf-8') as config_file:
config.write(config_file)
2) 查找文件
查找文件内容,类似字典的形式
 print(config.sections())        #  []

 config.read('config.ini')

 print(config.sections())        #   ['funyou.net', 'hongsun.com']

 print('bytebong.com' in config)  # False
print('funyou.net' in config) # True print(config['funyou.net']["admin"]) # funyou print(config['DEFAULT']['Compression']) #yes print(config['hongsun.com']['ForwardX11']) #yes 自己没有会去找DEFAULT中的,如果没有报错! print(config['hongsun.com']) # <Section: hongsun.com> for key in config['hongsun.com']: # 注意,有default会默认default的键
print(key) print(config.options('funyou.net')) # 同for循环,找到'funyou.net'下所有键(包含默认组中的) print(config.items('funyou.net')) # 找到'funyou.net'下所有键值对(包含默认组中的) print(config.get('funyou.net','compression')) # yes get方法Section下的key对应的value
3)增删改操作
 config.add_section('typhoon.org')

 config.remove_section('funyou.net')
config.remove_option('typhoon.org',"forwardx11") config.set('typhoon.org','admin','typhoon')
config.set('typhoon.org', 'super admin', 'json')
with open('setting.ini', "w") as c_f:
config.write(c_f)

2、加密相关的hashlib模块

 # 1、使用场景
# 1)加密需要保护的数据:如登录密码
# 2)比较文件的一致性 # 2、hashlib模块标准使用流程 # 1)、导入模块
import hashlib
# 2)得到md5(或其他算法)对象
md5 = hashlib.md5()
sha1 = hashlib.sha1()
str = b'1432342afsd'
# 3)将二进制的对象,放入进行更新
md5.update(str)
sha1.update(str)
# 4)进行消化,得到加密结果
print(md5.hexdigest(), sha1.hexdigest()) # 不管算法多么不同,摘要的功能始终不变
# 对于相同的字符串使用同一个算法进行摘要,得到的值总是不变的
# 使用不同算法对相同的字符串进行摘要,得到的值应该不同
# 不管使用什么算法,hashlib的方式永远不变 # sha 算法 随着 算法复杂程度的增加 我摘要的时间成本空间成本都会增加 # 3、加盐 为了对付如下情况:
# 虽然MD5摘要算法,是不可逆的,但是有人用穷举法,
# 将大部分可能的字符组合对应的加密结果放入数据库中。即撞库!
md5 = hashlib.md5(b'salt') # 4、动态加盐,将一些固定的字符串,取其一部分作为盐撒进去!
# import hashlib # 提供摘要算法的模块
md5 = hashlib.md5(bytes('盐',encoding='utf-8')+b'')
# md5 = hashlib.md5()
md5.update(b'')
print(md5.hexdigest()) # 5、可以将要加密的内容分开进行update,这跟一次update结果一样,
# 适合文件一致性比较,文件内容很多,可以分成好多次update,但是结果是相同的
with open('1_复习昨天内容.py', mode='rb') as f:
for line in f.readlines():
md5.update(bytes(line))
print(md5.hexdigest())
# 文件的一致性校验 不用加盐 # 6、典型应用,用户注册和登录
account = input('请输入登录账号:》》》').strip()
pwd = input('请输入登录密码:》》》').strip()
md5 = hashlib.md5(b'sl'+bytes(account[2:],encoding='utf-8'))
md5.update(bytes(pwd, encoding='utf-8'))
md5_pwd = md5.hexdigest()
#注册部分
# with open('userinfo',mode='w', encoding='utf-8') as f:
# f.write('%s|%s'%(account, md5_pwd))
# 登录部分
with open('userinfo', encoding='utf-8') as f:
for line in f.readlines():
name, pwd_md5 = line.split('|')
if account == name and pwd_md5 == md5_pwd:
print('登录成功!')
else:
print('登录失败!')

3、日志相关的logging模块

0) 标准配置

 import logging
from conf.my_log_settings import * logger = logging.getLogger()
logger.setLevel(logging.DEBUG) if not logger.handlers: fh = logging.FileHandler(filename=log_file, mode='a', encoding='utf-8')
sh = logging.StreamHandler() formatter = logging.Formatter(fmt='%(asctime)s / %(name)s / %(levelname)s /line_no:[%(lineno)d] / %(message)s',
datefmt='%Y-%m-%d %X') fh.setFormatter(formatter)
sh.setFormatter(formatter) logger.addHandler(fh)
logger.addHandler(sh)

1)初步配置

 import logging

 # 默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,
# 这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),
# 默认的日志格式为日志级别:Logger名称:用户输出消息。 # 1) 基本配置 缺点:只能在文件中查看,无法打印到屏幕上 # 创建一个handler,用于写入日志文件
file_handler = logging.FileHandler(filename='x.log', mode='a', encoding='utf-8')
# logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
# datefmt='%Y-%m-%d %H:%M:%S %p',
# handlers=[file_handler,],
# level=logging.DEBUG
# ) # 2)高级配置 使用logger对象
logger = logging.getLogger()
# 再创建一个handler,用于输出到控制台
stream_handler = logging.StreamHandler() formatter_1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
formatter_2 = logging.Formatter('%(asctime)s / %(name)s / %(levelname)s /[line_No]%(lineno)d / %(message)s') file_handler.setFormatter(formatter_1)
stream_handler.setFormatter(formatter_2) logger.addHandler(file_handler) #logger对象可以添加多个fh和ch对象
logger.addHandler(stream_handler) logging.debug("this is debug message")
logging.info("this is info message")
logging.warning("this is warning message")
logging.error("this is error(错误) message")
logging.critical("this is critical message") # logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,
# Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:
# logger.setLevel(logging.Debug)设置级别,当然,也可以通过 fh.setLevel(logging.Debug)单对文件流设置某个级别。

2)配制参数详解

logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:

filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。 format参数中可能用到的格式化串:
%(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 字符串形式的当前时间。默认格式是 “-- ::,”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

3)分割日志存储

 import time,logging
from logging import handlers # 日志切割,当日志达到一定条数后,写入新的日志中取,名字在原日志后加时间:hongsun.log.2019-12-18_22-08-23 s_handler = logging.StreamHandler()
r_f_handler = handlers.RotatingFileHandler('funyou.log', maxBytes=1024, backupCount=25, encoding='utf-8')
t_r_f_handler = handlers.TimedRotatingFileHandler(filename='hongsun.log', when='s', interval=25, encoding='utf-8')
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[t_r_f_handler, s_handler, r_f_handler],
level=logging.ERROR
) for i in range(1, 100):
time.sleep(1)
logging.error('KeyboardInterrupt error %s'%str(i))

Python进阶-XVV hashlib模块、configparse模块、logging模块的更多相关文章

  1. Python进阶----UDP协议使用socket通信,socketserver模块实现并发

    Python进阶----UDP协议使用socket通信,socketserver模块实现并发 一丶基于UDP协议的socket 实现UDP协议传输数据 代码如下:

  2. python全栈开发day22-常用模块二(hashlib、configparse、logging)

    一.昨日内容回顾 1.钻石继承 #新式类,本身或父类显示继承object #找名字的时候是广度优先顺序 #有mro方法,super方法, # super并不是单纯的找父类,和mro顺序是完全对应的 # ...

  3. python之hashlib、configparser、logging模块

    hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数 ...

  4. 模块---hashlib、configparse、logging

    一.hashlib模块 hashlib模块介绍:hashlib这个模块提供了摘要算法,例如 MD5.hsa1 摘要算法又称为哈希算法,它是通过一个函数,把任意长度的数据转换为一个长度固定的数据串,这个 ...

  5. python hashlib、configparse、logging

    一.hashlib 1.Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等.     2.摘要算法 通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目 ...

  6. collections、random、hashlib、configparser、logging模块

    collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...

  7. Python模块:日志输出—logging模块

    1. logging介绍 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用.这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/ ...

  8. python基础——14(shelve/shutil/random/logging模块/标准流)

    一.标准流 1.1.标准输入流 res = sys.stdin.read(3) 可以设置读取的字节数 print(res) res = sys.stdin.readline() print(res) ...

  9. python 之 软件开发目录规范 、logging模块

    6.4 软件开发目录规范 软件(例如:ATM)目录应该包含: 文件名 存放 备注 bin start.py,用于起动程序   core src.py,程序核心功能代码   conf settings. ...

随机推荐

  1. Re-stheasy

    https://dn.jarvisoj.com/challengefiles/ctf2.b93676be23733b2fcda3988c1133c1c1 用IDA-32bit 打开,找到main函数 ...

  2. SQL查询--内连接、外连接、自连接查询

    先创建2个表:学生表和教师表   1.内连接: 在每个表中找出符合条件的共有记录.[x inner join y on...] 第一种写法:只用where SELECT t.TEACHER_NAME, ...

  3. Codeforces Round #594 (Div. 2) B. Grow The Tree 水题

    B. Grow The Tree Gardener Alexey teaches competitive programming to high school students. To congrat ...

  4. Educational Codeforces Round 37 (Rated for Div. 2) E. Connected Components? 图论

    E. Connected Components? You are given an undirected graph consisting of n vertices and edges. Inste ...

  5. Python进阶小结

    目录 一.异常TODO 二.深浅拷贝 2.1 拷贝 2.2 浅拷贝 2.3 深拷贝 三.数据类型内置方法 3.1 数字类型内置方法 3.1.1 整型 3.1.2 浮点型 3.2 字符串类型内置方法 3 ...

  6. 1+x证书Web前端开发HTML+CSS专项练习测试题(八)

    1+x证书Web前端开发HTML+CSS专项练习测试题(八) 官方QQ群 1+x 证书 Web 前端开发 HTML+CSS 专项练习测试题(八) http://blog.zh66.club/index ...

  7. spring的事件机制实战

    理论 在分布式场景下,实现同步转异步的方式有三种方式: 1.异步线程池执行:比如借助@Asyn注解,放到spring自带的线程池中去执行: 2.放到消息队列中,在消费者的代码中异步的消费,执行相关的逻 ...

  8. MVC教程:MVC区域路由

    一.区域路由 为了管理网站中大量的文件,在ASP.NET MVC 2.0版本中引入了一个新概念:区域(Area). 有了区域以后,可以让我们的项目不至于太复杂而导致管理混乱.每个模块的页面都放入相应的 ...

  9. MySQL学习——操作表里的数据

    MySQL学习——操作表里的数据 摘要:本文主要学习了使用DML语句操作表里数据的方法. 插入数据 语法 通过传入数据插入: insert into 表名 [(列名1, …, 列名n)] values ...

  10. Python【day 14-4】sorted filter map+递归文件夹+二分法查找

    def func(x): #普通函数 return x*x ret1 = func(10) #匿名函数 f = lambda x:x*x # 匿名函数写法: 匿名函数名=lambda 参数:返回值 ' ...