函数知识点 1.包 2.hashlib模块 --- 摘要算法模块 3.logging模块 4.openpyxl模块 5.深浅拷贝 # 17
Posted 灵虚御风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数知识点 1.包 2.hashlib模块 --- 摘要算法模块 3.logging模块 4.openpyxl模块 5.深浅拷贝 # 17相关的知识,希望对你有一定的参考价值。
函数知识点
1.包
1 # coding(编码系统):utf-8 2 """ 3 1.模块的三种来源: 4 1.内置 5 2.第三方 6 3.自定义 7 2.模块的四种表现形式: 8 1. .py文件 9 2.共享文件 10 3.包 11 4.内置 12 3.研究模块和包: 13 # 还可以站在另外两个角度分析: 14 1.模块的开发者 15 2.模块的使用者 16 4.导模块的那一瞬间发生了什么? 17 首先运行执行文件run.py,创建一个run.py的名称空间 18 1.执行文件md,创建一个md的名称空间 19 2.把运行md得到的名字和内容存储到名称空间md中 20 3.返回一个指向执行文件run的名字md(import md)/返回一个指向执行文件run的内容的值的名字money(from md impory money) 21 多次导包不执行,沿用之前得到的结果 22 """ 23 """ 24 包: 25 1.定义: 26 1.一系列模块文件的结合体,表现在外部即为文件夹 27 2.这个包的内部通常具有一个__init__.py文件 28 2.本质:依然是模块 29 30 """ 31 """ 32 __init__.py 33 # 我记自己的方法: 34 # import os,sys 35 # sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))) 36 # from dir.dir1.dir11 import m1,m2,m3 37 38 # 老师的方法: 39 from dir.dir1.dir11.m2 import f2 40 from dir.dir1.dir11.m1 import f1 41 from dir.dir1.dir11.m3 import f3 42 """ 43 from dir.dir1 import dir11 44 # ps:在导入语句中 . 的左边肯定是一个包 45 # 方法一: 46 # dir11.m1.f1() # from m1 47 # dir11.m2.f2() # from m2 48 # dir11.m3.f3() # from m3 49 # 方法二 50 dir11.f1() 51 dir11.f2() 52 dir11.f3() 53 """ 54 # 导模块的那一瞬间,发生了什么? 55 首先运行执行文件run.py,创建一个run.py的名称空间 56 1.执行包,创建一个包下面的__init__.py的名称空间 57 2.把运行包得到的名字和内容存储到名称空间__init__.py中 58 3.返回一个指向执行文件run的名字settings 59 多次导包不执行,沿用之前得到的结果 60 """ 61 """ 62 3.研究模块和包: 63 # 还可以站在另外两个角度分析: 64 1.模块的开发者 65 2.模块的使用者 66 """ 67 """ 68 1.模块的开发者 69 # 1.相对导入 70 1.当模块的功能过多时,需要以文件的形式分类存储,方便管理 71 2.每个模块之间为了避免后期模块改名的问题 你可以使用相对导入(包里面的文件都应该是被导入的模块) 72 # 2.绝对导入 73 1.绝对导入要确认文件的路径,以包的路径为基准依次导入模块 74 2.为确保路径导入正确,要提前把文件路径添加到环境变量中(sys.path.append) 75 """ 76 """ 77 2.模块的使用者 78 """ 79 """ 80 python2-python3导包的区别: 81 Python2中导包必须有__init__.py文件,没有会报错 82 python3 导包没有__init__文件,也不会报错,因为Python3自动为包创建了__init__文件,所以在删除不必要文件的时候,千万不要随意删除__init__文件 83 """
2.hashlib模块 --- 摘要算法模块
1 """ 2 hashlib 加密模块 3 4 """ 5 """ 6 格式: 7 # 导模块 8 import hashlib # 这个加密的过程是无法解密的 9 ## 1.生成一个帮你造密文的对象 10 md = hashlib.md5() 11 ## 2.往对象里传明文数据 12 ps: 13 1.update只能接受bytes类型的数据 14 2.encode(\'utf-8\') 转码 15 md.update(\'hello\'.encode(\'utf-8\')) 16 ## 2.往对象里传明文数据 17 ps: 18 1.update只能接受bytes类型的数据 19 2.b\'\'转码 20 md.update(b\'Jason_@.\') 21 # 3.加盐 22 md.update(b\'dsfghljl;kl;;fdsrduytfuugiiui\') 23 ## 4.获取加密数据 24 # print(md.hexdigest()) 25 """ 26 # 撞库 27 """ 28 1.不用的算法 使用方法是相同的 29 密文的长度越长 内部对应的算法越复杂 30 但是 31 1.时间消耗越长 32 2.占用空间更大 33 通常情况下使用md5算法 就可以足够了 34 """ 35 """ 36 ps: 37 # 传入的内容 可以分多次传入 只要传入的内容相同 那么生成的密文肯定相同 38 """ 39 # 函数版本 40 """ 41 # 函数版本 ,加密加盐 42 # 动态加盐, 43 一般是把文件的名字或者CPU处理的时间,这些对象加进去,提高安全性 44 """ 45 import hashlib 46 def get_pwd(pwd): 47 48 md5 = hashlib.md5() 49 md5.update(b\'hhhh123456hhh\') 50 md5.update(pwd.encode(\'utf-8\')) 51 md5.update(b\'hhhj123456hgjhfghfhh\') 52 # md5.update(pwd.encode(\'utf-8\')) 53 return md5.hexdigest() 54 pwd = input(\'pwd>>>:\') 55 print(get_pwd(pwd)) 56 57 """ 58 应用场景: 59 1.密码的密文存储 60 2.校验文件内容是否一致 61 """
3.logging模块
两种日志方法:
1 """ 2 日志模块:记录流水 3 """ 4 import logging 5 6 # 二.日志的格式 7 # 1.文件 basicConfig 基本配置 8 # logging.basicConfig(filename=\'access.log\',format=\'%(asctime)s - %(name)s - %(levelname)s - %(module)s - %(message)s\',datefmt=\'%Y-%m-%d %H:%M:%S %p\',level=10,) 9 # 2.终端 10 # logging.basicConfig(format=\'%(asctime)s - %(name)s - %(levelname)s - %(module)s - %(message)s\',datefmt=\'%Y-%m-%d %H:%M:%S %p\',level=10,stream=True) 11 12 # 一.日志的五个等级,等级类似于:地震的强度 13 # # 1.走马观花,最不重要的信息 14 # logging.debug(\'debug日志\') # 10 15 # # 2.普通信息 16 # logging.info(\'info日志\') # 20 17 # # 3.警告信息 18 # logging.warning(\'warning日志\') # 30 19 # # 4.错误信息 20 # logging.error(\'errorr日志\') # 40 21 # # 5.严重错误信息 22 # logging.critical(\'critical日志\') # 50 23 24 """ 25 # 三.日志的四大成员--即四大对象 26 # 1.logger 对象 负责生产日志 27 # 2.filter 对象 过滤日志(了解) # 有好几层过滤 28 # 3.handler 对象 控制日志输出的位置(文件/终端) 29 # 4.formmater 对象 规定日志内容的格式 30 """ 31 """ 32 ps:日志的配置字典.py 33 34 """ 35 # 案例 36 # 1.logger 对象 负责生产日志 37 logger = logging.getLogger(\'转张记录\') 38 # print(logger) # <Logger 转张记录 (WARNING)> 39 40 # 2.filter 对象 过滤日志(了解) 41 42 # 3.handler 对象 控制日志输出的位置(文件/终端) 43 hd1 = logging.FileHandler(\'a1.log\',encoding=\'utf-8\') # 输入到文件中 44 hd2 = logging.FileHandler(\'a2.log\',encoding=\'utf-8\') # 输出到文件中 45 hd3 = logging.StreamHandler() # 输出到终端 46 # # 4.formmater 对象 规定日志内容的格式 47 fm1 = logging.Formatter(fmt=\'%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s\', 48 datefmt=\'%Y-%m-%d %H:%M:%S %p\',) 49 fm2 = logging.Formatter( 50 fmt=\'%(asctime)s - %(name)s: %(message)s\', 51 datefmt=\'%Y-%m-%d\',) 52 53 # 5.给logger对象绑定handler对象 54 logger.addHandler(hd1) 55 logger.addHandler(hd2) 56 logger.addHandler(hd3) 57 # 6.给hander绑定formmate对象 58 hd1.setFormatter(fm1) 59 hd2.setFormatter(fm2) 60 hd3.setFormatter(fm1) 61 # 7.设置日志登记 Level 等级 62 logger.setLevel(10) 63 # 8.记录日志 64 logger.debug(\'haofana,zhengshisble,nidayede aaaaaaaaaaaaaaaaaaaaaaa\') 65 66 # 值:2019-07-19 21:33:29 PM - 转张记录 - DEBUG -logging模块: haofana,zhengshisble,nidayede aaaaaaaaaaaaaaaaaaaaaaa
1 import os 2 import logging.config # 配置,布局 3 """ 4 知识点1:日志输出的格式 5 """ 6 # 定义三种日志输出的格式 # 开始 7 # standart 标准格式 8 standart_format = \'[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]\' \\ 9 \'[%(levelname)s][%(message)s]\' # name 为getlogger 指定的名字 10 # simple 简单格式 11 simple_format = \'[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s\' 12 # 定义日志输出的格式 # 结束 13 14 """ 15 # 知识点2 16 下面的两个变量对应的值 需要你手动修改 17 """ 18 # # log文件的目录 19 logfile_dir = os.path.dirname(__file__) 20 # log文件名 21 logfile_name = \'a3.log\' 22 23 24 """ 25 # 知识点3 26 # 如果不存在定义的日志目录就创建一个 27 """ 28 # os.path.isdir 判断指定路径是否存在 29 if not os.path.isdir(logfile_dir): 30 # os.mkdir 创建新文件 31 os.mkdir(logfile_dir) 32 """ 33 知识点4 34 log文件的全路径 35 """ 36 # 把指定路径拼接到名字中 37 logfile_path = os.path.join(logfile_dir,logfile_name) 38 39 """ 40 知识点5 41 log配置文件 42 """ 43 LOGGING_DIC = { 44 \'version\': 1, # version版本 45 \'disable_existing_loggers\': False, # disable_existing_loggers 禁用现有记录器 46 \'formatters\': { 47 \'standard\': { 48 \'format\': standart_format 49 }, # format 格式 50 \'simple\': { 51 \'format\': simple_format 52 }, 53 }, 54 \'filters\': {}, # 过滤日志 55 \'handlers\': { 56 #打印到终端的日志 57 \'console\': { 58 \'level\': \'DEBUG\', 59 \'class\': \'logging.StreamHandler\', # 打印到屏幕 60 \'formatter\': \'simple\' 61 }, 62 #打印到文件的日志,收集info及以上的日志 63 \'default\': { 64 \'level\': \'DEBUG\', 65 \'class\': \'logging.handlers.RotatingFileHandler\', # 保存到文件 66 \'formatter\': \'standard\', 67 \'filename\': logfile_path, # 日志文件 68 \'maxBytes\': 1024*1024*5, # 日志大小 5M 69 \'backupCount\': 5, 70 \'encoding\': \'utf-8\', # 日志文件的编码,再也不用担心中文log乱码了 71 }, 72 }, 73 \'loggers\': { 74 #logging.getLogger(__name__)拿到的logger配置 75 \'\': { 76 \'handlers\': [\'default\', \'console\'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 77 \'level\': \'DEBUG\', 78 \'propagate\': True, # 向上(更高level的logger)传递 79 }, # 当键不存在的情况下 默认都会使用该k:v配置 80 }, 81 } 82 """ 83 知识点5 84 使用日志字典配置 85 """ 86 # 自动加载字典中的配置 87 logging.config.dictConfig(LOGGING_DIC) 88 # 负责生产日志 89 logger1 = logging.getLogger(\'随机日志\') 90 # 记录日志 91 logger1.debug(\'haoxiang偶啊没但是我不能加油坚持就是胜利\') 92 93 # 结果 94 # 文件 a3.log 95 # cmd 96 # [DEBUG][2019-07-19 22:14:18,991][logging配置字典.py:91]haoxiang偶啊没但是我不能加油坚持就是胜利
4.openpyxl模块
1 """ 2 # 操作Excel表格读写 3 03版本之前 excel文件的后缀名 叫xls 4 03版本之后 excel文件的后缀名 叫xlsx 5 """ 6 """ 7 方法一 8 openpyxl模块 -- 近期比较火的操作 -- 只支持03版本之后 9 1.写 10 from openpyxl import Workbook 11 2.读 12 from openpyxl import load_workbook 13 方法二 及支持03版本之前,也支持03版本之后 14 xlwd 写 15 xlrt 读 16 """ 17 # 写 18 # from openpyxl import Workbook 19 # # 1.先生成一个工作铺 20 # wb = Workbook() 21 # # 2.创建一个表单页,0 :后面可以通过数字控制位置 22 # wb1 = wb.create_sheet(\'index\',0) 23 # wb2 = wb.create_sheet(\'index1\') 24 # # 3.创建标题,即表单页名称 25 # # ps:后期可以通过表单页对象点title修改表单页名称 26 # wb1.title = \'login\' 27 # # 4.单元格赋值 28 # # wb1[\'A3\'] = 666 29 # # wb1[\'A4\'] = 444 30 # # # 5.按坐标复制 row 列 column 行 31 # # wb1.cell(row=6,column=3,value=88888888) 32 # # # sum() 总和 33 # # wb1[\'A5\'] = \'=sum(A3:A4)\' 34 # # wb2[\'G6\'] = 999 35 # # 6.添加行标题 36 # wb1.append([\'username\',\'age\',\'hobby\']) 37 # # 7.行标题赋值 38 # wb1.append([\'jason\',18,\'study\']) 39 # wb1.append([\'tank\',72,\'吃生蚝\']) 40 # wb1.append([\'egon\',84,\'女教练\']) 41 # wb1.append([\'sean\',23,\'会所\']) 42 # wb1.append([\'nick\',28,]) 43 # wb1.append([\'nick\',\'\',\'秃头\']) 44 # # 8.保存新建的excel文件 45 # wb.save(\'2test.xlsx\') 46 47 # 读 48 from openpyxl import load_workbook 49 # 1.添加指定工作簿声明 data 数据 仅仅读数据 50 wb = load_workbook(\'2test.xlsx\',read_only=True,data_only=True) 51 # print(wb) # <openpyxl.workbook.workbook.Workbook object at 0x000001E4E75D6AC8> 52 # 2.打印表格页的名称 sheetnames 表格名字 53 # print(wb.sheetnames) # [\'login\', \'Sheet\', \'index1\'] 54 # print(wb[\'login\'][\'A3\'].value) # tank 55 # print(wb[\'login\'][\'A4\'].value) # egon 56 # print(wb[\'login\'][\'A5\'].value) # sean 57 # # ps:通过代码产生的excel表格必须经过人为操作之后才能读取出函数计算出来的结果值 58 59 res = wb[\'login\'] 60 # print(res) # <openpyxl.worksheet._read_only.ReadOnlyWorksheet object at 0x00000283375ECA58> 61 ge1 = res.rows 62 for i in ge1: 63 for j in i: 64 print(j.value)
5.深浅拷贝
1 """ 2 深拷贝与浅考的区别: 3 浅拷贝的本质: 4 对于可变类型,浅拷配指向依然以上是关于函数知识点 1.包 2.hashlib模块 --- 摘要算法模块 3.logging模块 4.openpyxl模块 5.深浅拷贝 # 17的主要内容,如果未能解决你的问题,请参考以下文章