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. 从傅里叶变换(FFT)到数论变换(NTT)

    FFT可以用来计算多项式乘法,但是复数的运算中含有大量的浮点数,精度较低.对于只有整数参与运算的多项式,有时,\(\text{NTT(Number-Theoretic Transform)}\)会是更 ...

  2. jenkins报错:Problem accessing /jenkins/. Reason: HTTP ERROR 404

    这是一个Jenkins的Bug.临时解决方法是:在浏览器中手工输入:http://<ip>:<port>.不要访问"/jenkins"这个路径.

  3. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

  4. #undef常用法

    Copy from C语言中#undef的语法是: #undef 标识符 用来将前面定义的宏标识符取消定义. 整理了如下几种常见用法,如果以后发现其他的再添加进来. 1.在一个程序块中用完宏定义后,为 ...

  5. expect实现非交互下的ssh连接, expect简单使用整理

    1. shell中使用ssh远程连接服务器做一些事情通常需要交互输入些信息, 可使用expect语句解决: 2. expect中设置变量语法: set name xxx set age    xxx  ...

  6. 用OC实现一个栈:结合单链表创建动态栈

    一.介绍 栈是一种数据存储结构,存储的数据具有先进后出的特点.栈一般分为动态栈和静态栈. 静态栈比较好理解,例如用数组实现的栈.动态栈可以用链表来实现. 方式:固定base指针,每次更改top指向入栈 ...

  7. 3、Hibernate的多表关联

    一.数据库中的表关系: 一对一关系 一个人对应一张身份证,一张身份证对应一个人,一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里 ...

  8. C#将Excel数据表导入SQL数据库的两种方法

    最近用写个winform程序想用excel 文件导入数据库中,网上寻求办法,找到了这个经过尝试可以使用. 方法一: 实现在c#中可高效的将excel数据导入到sqlserver数据库中,很多人通过循环 ...

  9. python基础(18):初识模块、re模块

    1. 认识模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用python编写的代码(. ...

  10. 315道Python常见面试题

    第一部分,Python基础篇 为什么学习Python? 通过什么途径学习的Python? Python和Java.PHP.C.C#.C++等其他语言的对比? 简述解释型和编译型编程语言? Python ...