day-17 包与模块

logging 模块

logging 配置字典

hashlib 模块

openpyxl 模块

深浅拷贝

 

一 模块

1.0.1 模块回顾

模块
# 三种来源1.内置的2.第三方的3.自定义的
# 四种表示形式1.py文件(******)2.共享库3.文件夹(一系列模块的结合体)(******)4.C++编译的连接到python内置的

 

1.0.2 模块与包

# 研究模块与包 还可以站另外两个角度分析不同的问题
# 1.模块的开发者
# 2.模块的使用者# 模块: 先产生一个执行文件的名称空间1.创建模块文件的名称空间2.执行模块文件中的代码 将产生的名字放入模块的名称空间中3.在执行文件中拿到一个指向模块名称空间的名字

1.1 什么是包?

#官网解释
Packages are a way of structuring Python’s module namespace by using “dotted module names”
包是一种通过使用'.模块名'来组织python模块名称空间的方式。#具体的:它是一系列模块文件的结合体,表示形式就是一个文件夹,该文件夹内部通常会有一个__init__.py文件,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来, 包的本质还是一个模块 
# from dir.dir1 import #需要强调的是:
1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块 

 

 

 

1.2 为何要使用包

# 包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来,随着功能越写越多,我们无法将所以功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性

 

1.3 注意事项

#1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。#2、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件#3、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间

 

1.4 案例示范

1 实验一准备:执行文件为test.py,内容#test.pyimport aaa同级目录下创建目录aaa,然后自建空__init__.py(或者干脆建包)需求:验证导入包就是在导入包下的__init__.py解决:先执行看结果再在__init__.py添加打印信息后,重新执行2、实验二准备:基于上面的结果需求:aaa.xaaa.y解决:在__init__.py中定义名字x和y3、实验三准备:在aaa下建立m1.py和m2.py#m1.pydef f1():print('from 1')#m2.pydef f2():print('from 2')需求:aaa.m1 #进而aaa.m1.func1()aaa.m2 #进而aaa.m2.func2()
解决:在__init__.py中定义名字m1和m2,先定义一个普通变量,再引出如何导入模块名,强调:环境变量是以执行文件为准4、实验四准备:在aaa下新建包bbb需求:aaa.bbb解决:在aaa的__init__.py内导入名字bbb5、实验五准备:在bbb下建立模块m3.py#m3.pydef f3():print('from 3')需求:aaa.bbb.m3 #进而aaa.bbb.m3.f3()
解决:是bbb下的名字m3,因而要在bbb的__init__.py文件中导入名字m3,from aaa.bbb import m36、实验六准备:基于上面的结果需求:aaa.m1()aaa.m2()aaa.m3()进而实现aaa.f1()aaa.f2()aaa.f3()先用绝对导入,再用相对导入解决:在aaa的__init__.py中拿到名字m1、m2、m3包内模块直接的相对导入,强调包的本质:包内的模块是用来被导入的,而不是被执行的用户无法区分模块是文件还是一个包,我们定义包是为了方便开发者维护7、实验七将包整理当做一个模块,移动到别的目录下,操作sys.path
View Code

 

1.5 导入包

# 首次导入包:
    先产生一个执行文件的名称空间1.创建包下面的__init__.py文件的名称空间2.执行包下面的__init__.py文件中的代码 将产生的名字放入包下面的__init__.py文件名称空间中3.在执行文件中拿到一个指向包下面的__init__.py文件名称空间的名字在导入语句中 .号的左边肯定是一个包(文件夹)# 当你作为包的设计者来说1.当模块的功能特别多的情况下 应该分文件管理2.每个模块之间为了避免后期模块改名的问题 你可以使用相对导入(包里面的文件都应该是被导入的模块)站在包的开发者 如果使用绝对路径来管理的自己的模块 那么它只需要永远以包的路径为基准依次导入模块
站在包的使用者 你必须得将包所在的那个文件夹路径添加到system path中(******)python2如果要导入包 包下面必须要有__init__.py文件
python3如果要导入包 包下面没有__init__.py文件也不会报错
当你在删程序不必要的文件的时候 千万不要随意删除__init__.py文件"""
# p.f1()
# p.f2()
# p.f3()
# p.f4()import p1

 

 

二 logging 模块

日志模块:记录

import logginglogging.basicConfig(filename='access.log',format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p',level=30,)logging.debug('debug日志')  # 10
logging.info('info日志')  # 20
logging.warning('warning日志')  # 30
logging.error('error日志')  # 40
logging.critical('critical日志')  # 50

 

问题

# 1.乱码
# 2.日志格式
# 3.如何既打印到终端又写到文件中

日志分为五个等级   等级:地震的强度

# 1.logger对象:负责产生日志
# 2.filter对象:过滤日志(了解)
# 3.handler对象:控制日志输出的位置(文件/终端)
# 4.formmater对象:规定日志内容的格式

 

hfajks

import logging# 1.logger对象:负责产生日志
logger = logging.getLogger('转账记录')
# 2.filter对象:过滤日志(了解)# 3.handler对象:控制日志输出的位置(文件/终端)
hd1 = logging.FileHandler('a1.log',encoding='utf-8')  # 输出到文件中
hd2 = logging.FileHandler('a2.log',encoding='utf-8')  # 输出到文件中
hd3 = logging.StreamHandler()  # 输出到终端# 4.formmater对象:规定日志内容的格式
fm1 = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p',
)
fm2 = logging.Formatter(fmt='%(asctime)s - %(name)s:  %(message)s',datefmt='%Y-%m-%d',
)# 5.给logger对象绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)# 6.给handler绑定formmate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)# 7.设置日志等级
logger.setLevel(20)# 8.记录日志
logger.debug('写了半天 好累啊 好热啊 好想释放')

 

logging配置字典

 

import os
import logging.config# 定义三种日志输出格式 开始

standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'# 定义日志输出格式 结束
"""
下面的两个变量对应的值 需要你手动修改
"""
logfile_dir = os.path.dirname(__file__)  # log文件的目录
logfile_name = 'a3.log'  # log文件名# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir):os.mkdir(logfile_dir)# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name)
# log配置字典
LOGGING_DIC = {'version': 1,'disable_existing_loggers': False,'formatters': {'standard': {'format': standard_format},'simple': {'format': simple_format},},'filters': {},  # 过滤日志'handlers': {#打印到终端的日志'console': {'level': 'DEBUG','class': 'logging.StreamHandler',  # 打印到屏幕'formatter': 'simple'},#打印到文件的日志,收集info及以上的日志'default': {'level': 'DEBUG','class': 'logging.handlers.RotatingFileHandler',  # 保存到文件'formatter': 'standard','filename': logfile_path,  # 日志文件'maxBytes': 1024*1024*5,  # 日志大小 5M'backupCount': 5,'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },},'loggers': {#logging.getLogger(__name__)拿到的logger配置'': {'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕'level': 'DEBUG','propagate': True,  # 向上(更高level的logger)传递},  # 当键不存在的情况下 默认都会使用该k:v配置
    },
}# 使用日志字典配置
logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
logger1 = logging.getLogger('asajdjdskaj')
logger1.debug('好好的 不要浮躁 努力就有收获')
View Code

 hashlib模块

hashlib模块 加密的模块
import hashlib  # 这个加密的过程是无法解密的
md = hashlib.sha3_256()  # 生成一个帮你造密文的对象
# md.update('hello'.encode('utf-8'))  # 往对象里传明文数据  update只能接受bytes类型的数据
md.update(b'Jason_@.')  # 往对象里传明文数据  update只能接受bytes类型的数据
print(md.hexdigest())  # 获取明文数据对应的密文

撞库

1.不用的算法 使用方法是相同的
密文的长度越长 内部对应的算法越复杂
但是1.时间消耗越长2.占用空间更大
通常情况下使用md5算法 就可以足够了

 

dffh

import hashlib
# 传入的内容 可以分多次传入 只要传入的内容相同 那么生成的密文肯定相同
md = hashlib.md5()
md.update(b'areyouok?')
md.update(b'are')
md.update(b'you')
md.update(b'ok?')
print(md.hexdigest())  # 408ac8c66b1e988ee8e2862edea06cc7
408ac8c66b1e988ee8e2862edea06cc7

hashlib模块应用场景
1.密码的密文存储
2.校验文件内容是否一致

 

加盐处理

import hashlibmd = hashlib.md5()
# 公司自己在每一个需要加密的数据之前 先手动添加一些内容
md.update(b'oldboy.com')  # 加盐处理
md.update(b'hello')  # 真正的内容
print(md.hexdigest())

动态加盐

import hashlibdef get_md5(data):md = hashlib.md5()md.update('加盐'.encode('utf-8'))md.update(data.encode('utf-8'))return md.hexdigest()password = input('password>>>:')
res = get_md5(password)
print(res)

 

 

 

openpyxl模块

openpyxl 简介

# openpyxl 比较火的操作excel表格的模块

03版本之前 excel文件的后缀名 叫xls
03版本之后 excel文件的后缀名 叫xlsxxlwd  写excel
xlrt  读excelxlwd和xlrt既支持03版本之前的excel文件也支持03版本之后的excel文件
openpyxl 只支持03版本之后的  xlsx

 

from openpyxl import Workbookwb = 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')

 

sdj

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)

 

 

深浅拷贝

浅拷贝

 

深拷贝

 

应用

import copyl = [1,2,[1,2]]
# l1 = l
# print(id(l),id(l1))
# l1 = copy.copy(l)  # 拷贝一份 .......  浅拷贝
# print(id(l),id(l1))
# # l[0] = 222
# # print(l,l1)
# l[2].append(666)
# print(l,l1)
l1 = copy.deepcopy(l)
l[2].append(666)
print(l,l1)

 

 

 

 

 

asdf

adff

 

转载于:https://www.cnblogs.com/Ryan-Yuan/p/11222236.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jeff Dean长文展望:2021年之后,机器学习领域的五大潜力趋势

来源:机器之心报编辑:杜伟、蛋酱2021 年之后,机器学习将会对哪些领域产生前所未有的影响?在过去的数年,见证了机器学习(ML)和计算机科学领域的许多变化。按照这种长弧形的进步模式,人…

4.3.5子网划分和子网掩码

4.3.5子网划分和子网掩码 文章目录4.3.5子网划分和子网掩码1.子网划分2.使用子网时分组的转发1.子网划分 2.使用子网时分组的转发 相关链接-计算机网络(4.10)网络层- 使用子网时分组的转发

专享!解读抖音企业蓝V认证的详细流程是怎样的

抖音现在是国内非常火的短视频软件,随着用户量的与日俱增,很多商家抓住了商机,开始在抖音宣传自己的商品。而抖音蓝V认证则是快速提升企业品牌知名度的一种渠道,但很多朋友不知道怎么申请蓝V认证,今天就给大家讲解一下…

深度学习的可解释性!

来源:智源社区 作者:知源月旦一、深度学习的可解释性研究概述随着深度学习模型在人们日常生活中的许多场景下扮演着越来越重要的角色,模型的「可解释性」成为了决定用户是否能够「信任」这些模型的关键因素(尤其是当我们需要机器为…

4.3.6无分类编址CIDR(构成超网)

4.3.6无分类编址CIDR ps:无类别域间路由(Classless Inter-Domain Routing、CIDR) 文章目录4.3.6无分类编址CIDR1.无分类编址CIDR2.构成超网3.最长前缀匹配1.无分类编址CIDR 2.构成超网 3.最长前缀匹配

生命真的源于宇宙吗?多名宇航员身体,都曾发生“不可逆”的变化

来源:科学的乐园宇航员是世界上最伟大的职业之一,他们为人类的宇宙探索付出了很多。同时宇航员也是世界上最难的职业,要先成为出色的飞行员,满足一定时间的飞行,经过严格的训练和筛选,才有可能成为宇航员。…

4.3.7 ARP协议

4.3.7 ARP协议 文章目录4.3.7 ARP协议发送数据的过程ARP协议发送数据的过程 路由器、交换机、集线器的区别 网络中一张图片是怎么被传输的-被拆分的身份证 1号给3号发,(同一局域网,arp请求得到mac地址) ps:交换机是…

图解:卷积神经网络数学原理解析

来源:图灵人工智能作 者:Piotr Skalski 编 辑 | Pita  翻 译:通夜(中山大学)、had_in(电子科技大学) 原标题:Gentle Dive into Math Behind Convolutional Neural Networks自动驾…

4.3.8 DHCP协议

4.3.8 DHCP协议 文章目录4.3.8 DHCP协议1.主机如何获得IP地址?DHCP协议1.主机如何获得IP地址? DHCP协议

深度学习与工业互联网安全

来源:中国工程院院刊摘 要:工业互联网安全是制造强国和网络强国建设的基石,深度学习因其具有表达能力强、适应性好、可移植性高等优点而可支持“智能自主式”工业互联网安全体系与方法构建,因此促进深度学习与工业互联网安全的融…

4.3.9 ICMP协议

4.3.9 ICMP协议 文章目录4.3.9 ICMP协议网际控制报文协议ICMPICMP差错报告报文(5种)ICMP差错报告报文数据字段不应发送ICMP差错报文的情况ICMP询问报文ICMP的应用网际控制报文协议ICMP ICMP差错报告报文(5种) ICMP差错报告报文数据字段 不应发送ICMP差错报文的情况 ICMP询问报文…

《Nature》挑战进化DNA突变理论!

通过研究一种小型开花杂草叶菜的基因组,我们对DNA突变有了新的认识来源:生物通加州大学戴维斯分校的研究人员发现,DNA突变不是随机的。这改变了我们对进化的理解,有一天可以帮助研究人员培育更好的作物,甚至帮助人类对…

《戏说网络二三事》序1

博主也是第一次写这种用故事讲述技术,写的可能。。很难看。。哪里写的不太好能一起讨论下嘛qq208820388,博主也在不断的反思自己,提高写作水平的,emmm 愿人生的路上,你我共勉~ 导语:文章合为时而著,歌诗合为…

量子技术新突破!科学家完美实现将单个原子逐一嵌入硅晶片

来源:前瞻经济学人APP资讯组图源:墨尔本大学近日,墨尔本大学领导的一个科研团队表示,已经完美实现将单个原子逐一嵌入硅晶片。这种新技术,可有助于制造包含数十亿晶体管、廉价且可靠的量子计算机设备。研究作者David J…

4.1-大秦立国-ip演变

4.1-大秦立国-ip演变 1.戏精说历史 且说那大秦君主初立秦国,人口稀少,户部管理的也省事,将人口划分为数个层次,越往其上,人口越少,越往其下,人口越多,且每层可容纳人数都是规定好的…

当思想与机器融合:脑机接口与人类的现在、困境与未来

来源:AI科技评论作者:苏宸编辑:陈彩娴当眼动追踪应用于捕捉受试者的视觉信息,脑电相关设备记录研究者的头皮表面神经活动……人的身体作为感知的媒介正愈发参与到人机交互的传播过程中。当思想与机器深入融合,通过人脑…

4.7移动IP

4.7移动IP 文章目录4.7移动IP移动IP移动ip相关术语移动ip通信过程移动IP 移动ip相关术语 移动ip通信过程

Jeff Dean | 回顾2021:除了超大的AI模型,谷歌还有啥?

来源:新智元作者:Jeff Dean 谷歌AI掌门人新年伊始,谷歌AI掌门人Jeff Dean的年度总结「虽迟但到」,这篇万字长文系统回顾了过去一年来机器学习领域的五大趋势。除了超大AI模型,谷歌去年还做了啥?2021年&…

4.8网络层设备

4.8网络层设备 文章目录路由器输入端口对线路上收到的分组的处理输出端口对线路上收到的分组的处理三层设备的区别路由表与路由转发路由器 输入端口对线路上收到的分组的处理 输出端口对线路上收到的分组的处理 三层设备的区别 路由表与路由转发

高文院士:人工智能发展机遇

来源:中关村互联网金融研究院、天成智汇作者:高文什么叫人工智能呢?人工智能是人类智能的一个计算机的实现,从对决的角度,它永远不可能超过人类智能,只是说在某一个特定的方面它可能胜出,但从智…