包、logging模块、hashlib模块、openpyxl模块、深浅拷贝

一、包

1、模块与包

模块的三种来源:

1、内置的

2、第三方的

3、自定义的

模块的四种表现形式:

1、py文件

2、共享库

3、文件夹(一系列模块的结合体),即包

4、C++编译的连接到Python内置的

2、模块的导入过程

先产生一个执行文件的名称空间

1、创建模块文件的名称空间

2、执行模块文件中的代码,将产生的名字放入模块的名称空间中

3、在执行文件中拿到一个指向模块名称空间的名字

3、什么是包

它是一系列模块文件的结合体,表示形式就是一个文件夹,该文件夹内部通常会有一个__init__.py文件,包的本质还是一个模块。

4、包的导入过程

先产生一个执行文件的名称空间

1、创建包下面的__init__.py文件的名称空间

2、执行包下面的__init__.py文件中的代码,将产生的名字放入包下面的__init__.py文件名称空间中

3、在执行文件中拿到一个不指向包下面的__init__.py文件名称空间的名字

在导入与语句中.号的左边肯定是一个包(文件夹)

5、包的使用

当你作为包的设计者来说

1、当模块的功能特别多的情况下,应该分文件管理

2、每个模块之间为了避免后期包改名的问题,你可以使用相对导入(包里面的文件都应该是被导入的模块)

3、站在包的开发者:如果使用绝对路径来管理自己写的模块,那么他只需要永远以包的路径为基准依次导入模块

4、站在包的使用者:你必须得将包所在的那个文件夹路径添加到system path中(***无法省略)

5、Python2如果要导入包,包下面必须要有__init__.py文件

6、Python3如果要导入包,包下面没有__init__.py文件也不会报错

7、当你在删除程序不必要的文件的时候,千万不要随意删除__init__.py文件

二、logging模块(日志模块)

1、日志级别

import logging
logging.debug('debug message') # 10
logging.info('info message') # 20
logging.warning('warning message') # 30
logging.error('error message') # 40
logging.critical('critical message') # 50

默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL>ERROR>WARNING>INFO>DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息

2、日志对象

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、formatter对象:规定日志内容的格式
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绑定formate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm3) 7、设置日志等级
logger.setLevel(20) 8、记录日志
logger.debug('写了半天 好累啊 好热啊 好像释放')

![https://files-cdn.cnblogs.com/files/DcentMan/微信图片_20190719221602.bmp)

3、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_DIR = 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('xxx') # 输入的名字在上面的字典中可以不存在,但是字典的key必须是''
logger1.debug('好好地 不要浮躁 努力就有收获')

三、hashlib模块(加密模块)

1、hashlib模块的加密过程非常复杂,解密难度很大

2、hashlib模块下的加密算法非常多,不同的算法,使用的方法是相同的,密文的长度越长,内部对应的算法越复杂,但是时间消耗越长,占用空间越大,通常情况下使用md5算法

3、hashlib模块加密过程程序实现

import hashlib
md = hashlib.md5() # 生成一个帮你造密文的对象
md.update('hello'.encode('utf-8')) # 往对象里传明文数据 update只能接收bytes类型的数据
print(md.hexdigest()) # 获取明文数据对应的密文

4、传入的内容可以分多次传入,只要传入的内容相同,那么生成的密文肯定相同

import hashlib
md = hashlib.md5()
md.update(b'areyouok?')
print(md.hexdigest())
md1 = hashlib.md5()
md1.update(b'are')
md1.update(b'you')
md1.update(b'ok?')
print(md1.hexdigest())
# 两次打印的结果相同

5、hashlib模块除了用于密码的密文存储,还可以用于校验文件内容是否一致

6、加盐处理,加盐的内容不定,可以改变,还可以动态加盐,比如在注册成功后,保存密码时在密码前添加几位用户名中的字符。

import hashlib
def 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模块(最近比较火的操作Excel表格的模块)

1、03版本之前,Excel文件的后缀名叫xls;03版本之后,Excel文件的后缀名叫xlsx

2、之前操作Excel文件的模块是xlwd(写)和xlrt(读),xlwd和xlrt既支持03版本之前的Excel文件也支持03版本之后的Excel文件。openpyxl只支持03版本之后的xlsx文件

3、写文件

from openpyxl import Workbook
wb = Workbook() # 先生成一个工作簿
wb1 = wb.create_sheet('sheet1',0) # 在指定位置创建一个表单页
wb2 = wb.create_sheet('sheet2')
wb1.title = 'login' # 可以通过title方法对已生成的表单页重命名
wb1['A3'] = 666 # 在指定位置添加值 A是列,3是行
wb1['A4'] = 111
wb1['A5'] = '=sum(A3:A4)' # 通过sum函数求和 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','','秃头']) # 以空字符表示该位置为空 wb.save('test.xlsx') # 保存新建的文件

4、读文件

from openpyxl import load_workbook

wb = load_workbook('test.xlsx',read_only=True, data_only=True)
print(wb)
# <openpyxl.workbook.workbook.Workbook object at 0x032CD0D0>
print(wb.sheetnames)
# ['login', 'Sheet', 'sheet2']
print(wb['login']['A3'].value) # 666
print(wb['login']['A4'].value) # 111
print(wb['login']['A5'].value) # None
# 如果没有指定data_only=True参数,且你并没有打开文件修改其中的内容,A5打印出的内容就会是=sum(A3:A4)
# 通过代码产生的excel表格必须经过人为操作之后才能读取出函数计算出来的结果值 res = wb['login']
print(res) # <openpyxl.worksheet._read_only.ReadOnlyWorksheet object at 0x03FDC250>
get1 = res.rows
for i in ge1:
for j in i:
print(j.value)
'''
print(j.value)的值
None
None
666
111
None
'''
'''
print(j)的值
<EmptyCell>
<EmptyCell>
<ReadOnlyCell 'login'.A3>
<ReadOnlyCell 'login'.A4>
<ReadOnlyCell 'login'.A5>
'''

五、深浅拷贝

1、Python内置有浅拷贝copy方法,要想进行深拷贝操作,需要导入copy模块

2、copy模块中,浅拷贝用copy.copy(),深拷贝用copy.deepcopy()

3、深浅拷贝的区别在于可变类型数据的拷贝,浅拷贝内的可变数据还是指向原来的值,所以对原数据中的可变类型进行修改时,拷贝后的数据也会跟着变。而深拷贝内的可变数据指向一个新的与原来数据相同的值,所以改变原数据中的可变数据时,拷贝后的数据并不会改变。

![https://files-cdn.cnblogs.com/files/DcentMan/微信图片_20190720004335.bmp)

![https://files-cdn.cnblogs.com/files/DcentMan/微信图片_20190720003941.bmp)

包、logging模块、hashlib模块、openpyxl模块、深浅拷贝的更多相关文章

  1. python基础--包、logging、hashlib、openpyxl、深浅拷贝

    包:它是一系列模块文件的结合体,表现形式就是一个文件夹,该文件夹内部通常会有一个__init__.py文件,包的本质还是一个模块. 首次导入包:(在导入语句中中 . 号的左边肯定是一个包(文件夹)) ...

  2. s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译

    时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...

  3. logging、hashlib、collections模块

    一.hashlib模块(加密模块) 1.什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 , ...

  4. day17_7.19包与logging模块,深浅拷贝

    一.包 在模块的定义里,模块就是方法的集合,可以将一些常用的方法封装到一个py文件中,通过调用使用,而且,其中的表现形式也有以包的形式导入. 其实,包就是一系列模块的结合体,表示形式就是一个文件夹,在 ...

  5. python掉包侠与深浅拷贝

    今日所得 包 logging模块 hashlib模块 openpyxl模块 深浅拷贝 包 在学习模块的时候我们了解过模块的四种表现形式,其中的一种就是包. 什么是包? 它是一系列模块文件的结合体,表示 ...

  6. 2019-7-19 包、logging模块、hashlib(加密模块)、openpyxl模块、深浅拷贝

    一.包 什么是包: 它是一系列模块文件的结合体,表示形式就是一个文件夹.该文件内部通常会有一个__init__.py文件,包的本质还是一个模块,可以被调用,调包就相当于与调用__init__.py文件 ...

  7. 包,logging日志模块,copy深浅拷贝

    一 包 package 包就是一个包含了 __init__.py文件的文件夹 包是模块的一种表现形式,包即模块 首次导入包: 先创建一个执行文件的名称空间 1.创建包下面的__init__.py文件的 ...

  8. python包-logging-hashlib-openpyxl模块-深浅拷贝-04

    包 包: # 包是一系列模块文件的结合体,表现形式是文件夹,该文件夹内部通常会包含一个__init__.py文件,本质上还是一个模块 包呢,就是前两篇博客中提到的,模块的四种表现形式中的第三种 # 把 ...

  9. python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

随机推荐

  1. BBR在实时音视频领域的应用

    小议BBR算法 BBR全称Bottleneck Bandwidth and RTT,它是谷歌在2016年推出的全新的网络拥塞控制算法.要说明BBR算法,就不能不提TCP拥塞算法. 传统的TCP拥塞控制 ...

  2. centos7添加搜狗输入法

    https://www.cnblogs.com/eeexu123/p/9259430.html https://blog.csdn.net/jpch89/article/details/8190380 ...

  3. java-Timestamp

    java获取取得Timestamp类型的当前系统时间格式:2010-11-04 16:19:42 方法1: Timestampd = new Timestamp(System.currentTimeM ...

  4. js清空子节点

    删除全部子节点 function removeAllChild(){ var div = document.getElementById("div1"); while(div.ha ...

  5. IntelliJ IDEA常规配置教程

      IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手.代码自动提示.重构.J2EE支持.各类版本工具(git.sv ...

  6. linux环境jacoco接入

    我们通常会将测试覆盖率分为两个部分,即“需求覆盖率”和“代码覆盖率”. 需求覆盖:指的是测试人员对需求的了解程度,根据需求的可测试性来拆分成各个子需求点,来编写相应的测试用例,最终建立一个需求和用例的 ...

  7. HTML的链接标签

    网页的链接标签 文本超链接 图像超链接 格式:<a href="path" target="目标窗口位置" >链接文本或图像</a> 锚 ...

  8. AcWing 908. 最大不相交区间数量

    //1.将每个区间按右端点从小到大排序 //2.从前往后依次枚举每个区间,如果当前区间中已经包含点,就直接跳过,否则,选择当前区间的右端点 //选右端点的话,可以尽可能的包含在多个区间里 //那么选的 ...

  9. 1069 The Black Hole of Numbers (20分)

    1069 The Black Hole of Numbers (20分) 1. 题目 2. 思路 把输入的数字作为字符串,调用排序算法,求最大最小 3. 注意点 输入的数字的范围是(0, 104), ...

  10. Apache Kafka(十二)Log Cleanup 策略

    Log Cleanup 策略 在Kafka中,存在数据过期的机制,称为data expire.如何处理过期数据是根据指定的policy(策略)决定的,而处理过期数据的行为,即为log cleanup. ...