一、包
二、logging模块
三、hashlib
四、4.openpylx
五、深浅拷贝
一、包:
1.是一个文件夹 是一系列模块的结合体
2.该文件内部通常会有一个__init__.py文件
3.包的本质其实还是一个模块
包与模块执行时流程是什么?
模块:import
1.运行执行文件时,产生一个执行文件的名称空间
2.运行执行文件中的模块导入代码,并创建模块名称空间,并将模块在执行代码时产生的名字放在该模块名称空间里
3.在执行文件名称空间里拿到一个名字,该名字指向模块名称空间。此名字就是模块名字。然后在通过
模块名.名字 来去模块中名字的值
From … import…
前面两个流程一样,只是最后一个不一样
3.直接在执行文件名称空间中拿到一个名字,该名字就是模块名称空间中存在的名字,通过该名字可以直接取值
包:首次导入包 import
1.先创建一个执行文件的名称空间
2.在包下创建一个__init__.py文件的名称空间
3.在执行包下面的__init__.py文件中的代码,并产出一个__init__.py文件的名称空间
4.在包文件中拿到一个指向包下面的__init__.py文件名称空间的里面名字
通过 包.名字来取值
研究模块与包 还可以站另外两个角度分析不同的问题
1.模块的开发者
2.模块的使用者
在导入语句中 .号的左边肯定是一个包(文件夹)
当你作为包的设计者来说
1.当模块的功能特别多的情况下,应该分文件管理
2.每个模块之间为了避免后期模块改名字的问题,你可以使用相对导入(包里面的文件都应该是被导入的模块)
站在包的开发者:如果使用绝对路径来管理自己的模块,那么需要永远以包的路径为基准,依次导入模块
站在包的使用者:你必须得将包所在的那个文件夹路径添加到system path中
知识点:
1.python2如果要导入包,包下面必须要有__init__.py文件,不然报错
2.python3 如果要导入包,包下面没有__init__.py文件,也不会报错
当你要删除程序不必要的文件的时候,千万不要随意删除__init__.py文件
二、Logging 日志模块:记录信息
日志的五个等级 logging.(debug,info,warning,error,critical)
- debug日志 #10
- info日志 #20
- warning日志 #30
- error 日志 #40
- critical 日志 #50
在执行上面代码后,遇到以下问题:
- 文件里面存的是乱码
- 日志格式 已固定
- 如何既key打印到终端又可以写到文件中
学日志要了解的四个对象:
- Logger对象:复杂产生日志
- Filter对象:过滤日志对象(了解)
- Handle对象:控制日志输出的位置(文件/终端) FileHandler(文件) StreamHandler(终端)
- Formatter对象:规定日志内容的格式
一个日志编辑流程:
Import logging
- (Logger)产生一个logger对象 logger= logging.getlogger(‘写一个日志相关的名字’)
- (filter)过滤日志(了解)
- (handler)控制日志输出的位置(文:FileHandler 终端:StreamHandler)
Hd1 = logging.FileHandler(‘文件名’)
Hd2 = logging.StreamHandler()
- (Formatter)规定内容输出格式
第一种:fmt1=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p')
第二种:fmt2= logging.Formatter ('%(asctime)s - %(name)s - %(levelname)s: %(message)s',datefmt='%Y-%m-%d')
- 给logger对象绑定handler对象
Logger.addHandler(Hd1)
Logger.addHandler(Hd2)
6 给handler对象绑定formatter对象
Hd1.setFormatter(fmt1)
Hd2.setFormatter(fmt2)
7 设置日志等级
Logger.setLevel(级数) 10 20 30 40 50
8.记录日志
Logger.debug(内容1)
Logger.info(内容2)
Logger.warning(内容3)
Logger.error(内容4)
Logger.ccritical(内容5)
使用日志字典配置
- import os
- from logging import config
- logging.conifg. dictConfig(字典变量名)
- loggoer1 = logging.getlogger(‘给对象起个名字’)
- logging1.debug(‘内容1’)
logging1.info(‘内容2’)
logging1.waring(‘内容3’)
logging1.error(‘内容4’)
logging1.critical(‘内容5’)
三、hashlib 模块(加密模块)
import hashlib #这个加密的过程是无法解密的
md = hsahlib.md5() # 用md5这个算法生成一个密文对象
第一种方法:md.update(‘hello’.encode(‘utf-8’) # 往对象里传明文数据 update只能接受bytes类型的数据
第二种方法:md.update(b‘hello’) # 往对象里传明文数据 update只能接受bytes类型的数据
print(md.hexdigest()) # 获取明文数据对应的密文
注意:传入的内容 可以分多次传入 只要传入的内容相同 那么生成的密文肯定相同
hashlib模块应用场景
1.密码的密文存储
2.校验文件内容是否一致
加盐处理
**在用给写入密码之前 在加一些内容,组合在一起(静态加盐处理)
**动态加盐处理:就是加的这些内容是不断变化的
# 撞库
1.不用的算法 使用方法是相同的
密文的长度越长 内部对应的算法越复杂
但是
1.时间消耗越长
2.占用空间更大
通常情况下使用md5算法 就可以足够了
四、Openpyxl 模块
操作表格的模块有以下几个:
- openpyxl 是比较火的操作表格模块 03版本以后
- xlwd(写excel) xlrt(读excel) 都适用
了解的一个知识点:
03版本之前的excel文件的后缀名 叫xls
03版本之后的excel文件的后缀名 叫xlsx
写操作表格
From openpyxl import Workbook
Wb = workbook() # 生成一个工作簿
wb1 = wb.create_sheet('index',0) # 创建一个表单页 后面可以通过数字控制位置
wb1.title = 'login' # 后期可以通过表单页对象点title修改表单页名称,默认第一个表单
Wb.save(‘工作簿名字.xlsx’) 这里名字要加后缀。Xlsx
读操作表格
From openpylx import load_workbook
# 写
# from openpyxl import Workbook
#
#
# wb = Workbook() # 先生成一个工作簿
# wb1 = wb.create_sheet('index',0) # 创建一个表单页 后面可以通过数字控制位置
# wb2 = wb.create_sheet('index1')
# wb1.title = 'login' # 后期可以通过表单页对象点title修改表单页名称
#
# wb1['A3'] = 666
# wb1['A4'] = 444
# wb1.cell(row=6,column=3,value=88888888)
# wb1['A5'] = '=sum(A3:A4)'
#
# wb2['G6'] = 999
# wb1.append(['username','age','hobby'])
# wb1.append(['jason',18,'study'])
# wb1.append(['tank',72,'吃生蚝'])
# wb1.append(['egon',84,'女教练'])
# wb1.append(['sean',23,'会所'])
# wb1.append(['nick',28,])
# wb1.append(['nick','','秃头'])
# 保存新建的excel文件
# wb.save('test.xlsx')
from openpyxl import load_workbook # 读文件
wb = load_workbook('test.xlsx',read_only=True,data_only=True)
# print(wb)
# print(wb.sheetnames) # ['login', 'Sheet', 'index1']
# print(wb['login']['A3'].value)
# print(wb['login']['A4'].value)
# print(wb['login']['A5'].value) # 通过代码产生的excel表格必须经过人为操作之后才能读取出函数计算出来的结果值
res = wb['login']
# print(res)
ge1 = res.rows
for i in ge1:
for j in i:
print(j.value)
五、深浅拷贝: