常用模块及其使用(二)

一、模块

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

2.研究模块与包,还可以站另外两个角度分析不同的问题
  1.模块的开发者
  2.模块的使用者

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

4.当我们首次导入包:
  先产生一个执行文件的名称空间
    1.创建包下面的__init__.py文件的名称空间
    2.执行包下面___init__.py文件中的代码,将产生的名字放入包下面的__init__.py文件名称空间中
    3.在执行的文件中拿到一个指向包下面的__inint__.py文件名称空间的名字
5.当你作为包的设计者来说:
  1.模块的功能特别多的情况下,应该分文管理
  2.每个模块之间为了避免后期模块改名的问题,你可以使用相对导入(包里面的文件都应该是被导入的模块)
  站在包的开发者,如果使用绝对路径来管理的自己的模块,name它只需要永远以包的路径为基准依次导入模块
  站在包的使用者,你必须将包所在的那个文件夹路径添加system.path中

二、loggin模块

日志模块:用来记录

 import loggin
1
logging.basicConfig(filename='access.log', 2 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', 3 datefmt='%Y-%m-%d %H:%M:%S %p', 4 level=30, 5 ) 6 7 8 logging.debug('debug日志') # 10 9 logging.info('info日志') # 20 10 logging.warning('warning日志') # 30 11 logging.error('error日志') # 40 12 logging.critical('critical日志') # 50

logger对象:负责产生日志

filter对象:过滤日志

handler对象:控制了日志输出的位置(文件/终端)

formater对象:规定日志内容的格式

 1 import logging
 2 
 3 # 1.logger对象:负责产生日志
 4 logger = logging.getLogger('转账记录')
 5 # 2.filter对象:过滤日志(了解)
 6 
 7 # 3.handler对象:控制日志输出的位置(文件/终端)
 8 hd1 = logging.FileHandler('a1.log',encoding='utf-8')  # 输出到文件中
 9 hd2 = logging.FileHandler('a2.log',encoding='utf-8')  # 输出到文件中
10 hd3 = logging.StreamHandler()  # 输出到终端
11 
12 # 4.formmater对象:规定日志内容的格式
13 fm1 = logging.Formatter(
14         fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
15         datefmt='%Y-%m-%d %H:%M:%S %p',
16 )
17 fm2 = logging.Formatter(
18         fmt='%(asctime)s - %(name)s:  %(message)s',
19         datefmt='%Y-%m-%d',
20 )
21 
22 # 5.给logger对象绑定handler对象
23 logger.addHandler(hd1)
24 logger.addHandler(hd2)
25 logger.addHandler(hd3)
26 
27 # 6.给handler绑定formmate对象
28 hd1.setFormatter(fm1)
29 hd2.setFormatter(fm2)
30 hd3.setFormatter(fm1)
31 
32 # 7.设置日志等级
33 logger.setLevel(10)
34 
35 # 8.记录日志
36 logger.debug('我写完了')

配置一个log日志用了八个步骤,我们可以将它放入我们的配置文件夹,可以方便我们的使用,但是每次需要到日志功能都要写这八部属实麻烦,然后我们就将日志变成日志配置字典了。这样就会方便很多了。

 1 mport os
 2 import logging.config
 3 
 4 # 定义三种日志输出格式 开始
 5 
 6 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
 7                   '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
 8 
 9 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
10 
11 
12 
13 # 定义日志输出格式 结束
14 """
15 下面的两个变量对应的值 需要你手动修改
16 """
17 logfile_dir = os.path.dirname(__file__)  # log文件的目录
18 logfile_name = 'a3.log'  # log文件名
19 
20 # 如果不存在定义的日志目录就创建一个
21 if not os.path.isdir(logfile_dir):
22     os.mkdir(logfile_dir)
23 
24 # log文件的全路径
25 logfile_path = os.path.join(logfile_dir, logfile_name)
26 # log配置字典
27 LOGGING_DIC = {
28     'version': 1,
29     'disable_existing_loggers': False,
30     'formatters': {
31         'standard': {
32             'format': standard_format
33         },
34         'simple': {
35             'format': simple_format
36         },
37     },
38     'filters': {},  # 过滤日志
39     'handlers': {
40         #打印到终端的日志
41         'console': {
42             'level': 'DEBUG',
43             'class': 'logging.StreamHandler',  # 打印到屏幕
44             'formatter': 'simple'
45         },
46         #打印到文件的日志,收集info及以上的日志
47         'default': {
48             'level': 'DEBUG',
49             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
50             'formatter': 'standard',
51             'filename': logfile_path,  # 日志文件
52             'maxBytes': 1024*1024*5,  # 日志大小 5M
53             'backupCount': 5,
54             'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
55         },
56     },
57     'loggers': {
58         #logging.getLogger(__name__)拿到的logger配置
59         '': {
60             'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
61             'level': 'DEBUG',
62             'propagate': True,  # 向上(更高level的logger)传递
63         },  # 当键不存在的情况下 默认都会使用该k:v配置
64     },
65 }
66 
67 
68 # 使用日志字典配置
69 logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
70 logger1 = logging.getLogger('zzzzzj')
71 logger1.debug('这回终于轻松了很多')

三、hashlib模块

hashlib模块,加密的模块

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

密文的长度越长,内部对应的算法就越复杂,但是时间消耗就越长,占用空间也更大,通常情况下使用md5算法,就足够了。

1 import hashlib
2 # 传入的内容 可以分多次传入 只要传入的内容相同 那么生成的密文肯定相同
3 md = hashlib.md5()
4 md.update(b'areyouok?')#把它分开也是一样的
5 md.update(b'are')
6 md.update(b'you')
7 md.update(b'ok?')
8 print(md.hexdigest())  # 408ac8c66b1e988ee8e2862edea06cc7

hashlib模块应用场景

1.密码的密文存储

2.校验文件内容是否一致

加盐处理:

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

但是如果只是单单加盐,千篇一律容易发现你加的“盐”是什么?那么就要用到动态加盐。

四、openpyxl模块

openpyxl是比较火的用来操作excel表格的模块(需要先安装openpyxl模块)

excel写文件:

 1 from openpyxl import Workbook
 2 
 3 wb = Workbook()  # 先生成一个工作簿
 4 wb1 = wb.create_sheet('index',0)  # 创建一个表单页  后面可以通过数字控制位置
 5 wb2 = wb.create_sheet('index1')
 6 wb1.title = 'login'  # 后期可以通过表单页对象点title修改表单页名称
 7 
 8 wb1['A3'] = 666
 9 wb1['A4'] = 444
10 wb1.cell(row=6,column=3,value=88888888)
11 wb1['A5'] = '=sum(A3:A4)'
12 
13 wb2['G6'] = 999
14 wb1.append(['username','age','hobby'])
15 wb1.append(['琦玉',20,'打怪人'])
16 wb1.append(['杰诺斯',20,'拜师学艺'])
17 wb1.append(['King',30,'打酱油'])
18 wb1.append(['邦古',60,'找饿狼'])
19 wb1.append(['龙卷','18','超能力'])
20 wb1.append(['性感囚徒','25','男人'])
21 wb1.append(['饿狼','','收拾英雄'])

excel读文件:

 1 from openpyxl import load_workbook  # 读文件
 2 
 3 
 4 wb = load_workbook('test.xlsx',read_only=True,data_only=True)
 5 print(wb)
 6 print(wb.sheetnames)  # ['login', 'Sheet', 'index1']
 7 print(wb['login']['A3'].value)
 8 print(wb['login']['A4'].value)
 9 print(wb['login']['A5'].value)  # 通过代码产生的excel表格必须经过人为操作之后才能读取出函数计算出来的结果值
10 
11 res = wb['login']
12 print(res)
13 ge1 = res.rows
14 for i in ge1:
15     for j in i:
16         print(j.value)

七、深浅拷贝

 1 import copy
 2 
 3 l = [1,2,[1,2]]
 4 l1 = l
 5 print(id(l),id(l1))
 6 l1 = copy.copy(l)  # 拷贝一份 .......  浅拷贝
 7 print(id(l),id(l1))
 8 l[0] = 222
 9 print(l,l1)
10 l[2].append(666)
11 print(l,l1)
12 l1 = copy.deepcopy(l)
13 l[2].append(666)
14 print(l,l1)

  深浅拷贝图解:

       浅拷贝(copy):

  深拷贝(deepcopy):

 

 

posted @ 2019-07-20 21:18  朱朱朱朱朱  阅读(166)  评论(0编辑  收藏  举报