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. C++ 标准库,可变参数数量,参数类型相同

    #include <iostream> // 可变模板参数 // 此例:可以构造可变数量,可变类型的函数输入. // 摘自:https://www.cnblogs.com/qicosmos ...

  2. Paper | PyTorch: An Imperative Style, High-Performance Deep Learning Library

    目录 0. 摘要 1. 简介 2. 背景 3. 设计原则 4. 针对易用性的核心设计 4.1 让深度学习模块不过是Python程序 4.2 互用性和可拓展性 4.3 自动差分 5. 针对高性能的PyT ...

  3. MySQL下载和安装教程

    1.下载MySQL数据库可以访问官方网站:https://www.mysql.com/ 2.点击DOWNLOADS模块下的Community模块下的MySQL Community Server进行下载 ...

  4. Mybatis框架增删改查

    一.recourses中核心配置文件mybatis-config.xml 二. recourse中jdbc.properties 三.entity实体类 四.ISmbmsUserDao层 五.ISmb ...

  5. es6入门7--Set Map数据结构

    本文作为ES6入门第十三章的学习整理笔记,可能会包含少部分个人的理解推测,若想阅读更详细的介绍,还请阅读原文ES6入门 一.set数据结构 1.set不接受重复值 ES6新增了Set构造函数用于创建s ...

  6. 大话设计模式Python实现-单例模式

    单例模式(Singleton Pattern):保证类仅有一个实例,并提供一个访问它的全局访问点. 下面是单例模式的demo: #!/usr/bin/env python # -*- coding:u ...

  7. IT兄弟连 Java语法教程 位运算符

    Java定义了几个位运算符,它们都可以用于整数类型(long.int.short.byte以及char).这些运算符对操作数的单个位进行操作.表1 对位运算符进行了总结. 表1  位运算符 由于位运算 ...

  8. Percona Monitoring and Management (PMM) - 快速入门

    前言 数据库监控工具最常用的就是zabbix了,zabbix能将收集到的数据通过图表展示出来,并通过设置阈值及时告警.可zabbix对于文本的处理就不行了,比方说抓取数据库运行的sql,这个zabbi ...

  9. 深入理解Java中的Garbage Collection

    前提 最近由于系统业务量比较大,从生产的GC日志(结合Pinpoint)来看,需要对部分系统进行GC调优.但是鉴于以往不是专门做这一块,但是一直都有零散的积累,这里做一个相对全面的总结.本文只针对Ho ...

  10. 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体

    在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体ShowAllPage sAllPage = new ShowAllPage();   ...