1. 包
-
导入包的方式:
-
第一种方式(直接导入):import 包名.目录名.目录名n.模块名(中间所有的目录级别都使用.来连接,最后一个名字一定是模块名);使用时把import后面的所有当作一个整体来使用
import project.v1.core.main
-
第二种方式(直接导入):from 包名.目录名.目录名n import 模块名;使用时直接用模块名就可以
from project.v1.core import main
-
第三种方式:绝对路径导入
-
所有模块的导入从根目录开始
-
根目录发生变化,包内的模块和代码也会发生变化
-
在包内的代码调用时不会报错
-
根目录节点的位置是由sys.path中的路径决定
-
如果希望所有的程序都能正常运行,需要修改sys.path中的内容
-
第四种方式:相对路径导入
-
不用考虑当前目录的模块位置
-
根节点发生变化,包内的模块位置不受影响
-
在包内不能直接执行,不然会报错
-
只能在包外调用,不用关心内部模块的导入问题
-
第五种方式:使用*和__all__结合,利用from ... import *和__all__的相关配置来产生一种包定制
-
包导入的常用模版:
import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
print(sys.path)
from core import main
if __name__ == '__main__':
main.starting()
2. hashlib模块
-
说明:摘要算法模块
-
分类:md5、sha1、sha256、sha512
-
过程:不可逆
-
应用:
-
加密:最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示;SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示,比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长
# md5加密方式
import hashlib
# 普通方式
yy_md5 = hashlib.md5()
yy_md5.update('liyanloveyaya'.encode('utf-8'))
print(yy_md5.hexdigest())
# 数据量大时,多次调用update(),最后计算的结果是一样的
yan_md5 = hashlib.md5()
yan_md5.update('liyan'.encode('utf-8'))
yan_md5.update('love'.encode('utf-8'))
yan_md5.update('yaya'.encode('utf-8'))
print(yan_md5.hexdigest())
# 加盐方式
salt = 'salt'.encode('utf-8')
yy1 = hashlib.md5()
yy1.update(salt)
yy1.update('yy1'.encode('utf-8'))
print(yy1.hexdigest())
yy2 = hashlib.md5()
yy2.update(salt)
yy2.update('yy2'.encode('utf-8'))
print(yy2.hexdigest())
# 1. 加盐可以使用复杂性的加密方式,最好用大小写字母、数字和特殊符号的组合使用
# 2. 可以使用动态加盐的方式进行加密
>>>
d0fd8c4c2c0d6af33bbed2425d275a5f
d0fd8c4c2c0d6af33bbed2425d275a5f
808c9cb52f0a9d6cc3ad8c5d8a57217e
c90db841561b773553232b6ec7576e23d
# sha1加密方式
import hashlib
yy_sha1 = hashlib.sha1()
yy_sha1.update('liyanloveyaya'.encode('utf-8'))
print(yy_sha1.hexdigest())
yan_sha1 = hashlib.sha1()
yan_sha1.update('liyan'.encode('utf-8'))
yan_sha1.update('love'.encode('utf-8'))
yan_sha1.update('yaya'.encode('utf-8'))
print(yan_sha1.hexdigest())
salt = 'salt'.encode('utf-8')
yy1 = hashlib.sha1()
yy1.update(salt)
yy1.update('yy1'.encode('utf-8'))
print(yy1.hexdigest())
yy2 = hashlib.sha1()
yy2.update(salt)
yy2.update('yy2'.encode('utf-8'))
print(yy2.hexdigest())
>>>
cb15dcc3b29d8a38779f1968aa294790ae13729c
cb15dcc3b29d8a38779f1968aa294790ae13729c
063737cfa77f3e8fe7d530646302a09738f64db4
55238a894d69ad3ae13a4dc0bb671ab7bc51df58
3. configparse模块
-
说明:配置文件模块
-
作用:专门为解决一种样式的配置文件而产生的
# 初始化配置文件
import configparser
yy_config = configparser.ConfigParser()
# 实例化配置文件
yy_config['DEFAULT'] = {
'default': 'config'
}
# DEFAULT组是默认组,可有可无
yy_config['conf'] = {
'ip': '10.0.0.1',
'port': '3306',
'username': 'yy',
'password': '123456',
'db_name': 'yy_db'
}
with open('config.ini', 'w', encoding='utf-8') as f:
yy_config.write(f)
>>>'config.ini文件内容'
[DEFAULT]
default = config
[conf]
ip = 10.0.0.1
port = 3306
username = yy
password = 123456
db_name = yy_db
# 文件的查看操作(接上面代码)
yy_config.read('config.ini')
# 读取配置文件信息
print(yy_config['conf']['ip'])
# 查看组内一个键的值
print(yy_config.get('conf', 'db_name'))
# 查看组内一个键的值
print(yy_config.options('conf'))
# 查看组中所有的键,以列表的形式返回,也包括了默认组中的键
print(yy_config.items('conf'))
# 查看组中所有的键值对,键值对使用元组存储,每一对分别放在列表中返回,也包括了默认组中的键值对
>>>
10.0.0.1
yy_db
['ip', 'port', 'username', 'password', 'db_name', 'default']
[('default', 'config'), ('ip', '10.0.0.1'), ('port', '3306'), ('username', 'yy'), ('password', '123456'), ('db_name', 'yy_db')]
# 文件的增加操作(接上面代码)
yy_config.add_section('redis_config')
# 增加组
yy_config['conf']['db_engine'] = 'InnoDB'
yy_config['conf']['db_prefix'] = 'yy_'
yy_config['redis_config']['ip'] = '10.0.0.2'
yy_config['redis_config']['port'] = '6379'
yy_config['redis_config']['auth'] = 'redis_password'
# 增加组内的配置
yy_config.write(open('config.ini', 'w'))
# 文件操作增加完默认保存在内存中,需要使用写文件的操作保存操作结果
>>>'config.ini文件内容'
[DEFAULT]
default = config
[conf]
ip = 10.0.0.1
port = 3306
username = yy
password = 123456
db_name = yy_db
db_engine = InnoDB
db_prefix = yy_
[redis_config]
ip = 10.0.0.2
port = 6379
auth = redis_password
# 文件的修改操作(接上面代码)
yy_config.set('redis_config', 'auth', 'REDIS_Passw0rd')
# 修改组内键对应的值
yy_config.write(open('config.ini', 'w'))
>>>'config.ini文件内容'
[DEFAULT]
default = config
[conf]
ip = 10.0.0.1
port = 3306
username = yy
password = 123456
db_name = yy_db
db_engine = InnoDB
db_prefix = yy_
[redis_config]
ip = 10.0.0.2
port = 6379
auth = REDIS_Passw0rd
# 文件的删除操作(接上面代码)
yy_config.remove_section('redis_config')
# 删除整个组
yy_config.remove_option('conf', 'db_prefix')
# 删除组内指定的键值对
yy_config.write(open('config.ini', 'w'))
>>>'config.ini文件内容'
[DEFAULT]
default = config
[conf]
ip = 10.0.0.1
port = 3306
username = yy
password = 123456
db_name = yy_db
db_engine = InnoDB
4. logging模块
-
说明:日志模块
-
日志的描述:把程序运行的过程输出到屏幕或文件中记录,叫日志
-
日志级别(顺序是从上到下一级比一级严格):
-
logging.debug (调试模式)
-
logging.info (信息模式)
-
logging.warning (警告模式)
-
logging.error (错误模式)
-
logging.critical (批判模式)
-
设置日志级别:
-
默认设置全局输出的日志级别为debug模式:logger.setLevel(logging.Debug)
-
设置单个文件流或屏幕流的日志级别位debug模式:句柄名称.setLevel(logging.Debug)
-
简单模式:
import logging
logging.basicConfig(
level=logging.INFO,
# 日志级别
format='[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]',
# 日志输出格式(时间格式化、程序文件名、程序在文件中的行数、日至级别、日志描述信息)
datefmt='%Y-%m-%d %H:%M:%S',
# 日志的时间格式
filename='logging.log',
# 输出存储日志的文件名
filemode='a',
# 日志文件的打开模式
)
logging.debug('debug_message...')
logging.info('info_message...')
logging.warning('warning_message...')
logging.error('error_message...')
logging.critical('critical_message...')
>>>'logging.log文件内容'
[2017-11-23 16:42:55] [yan27.py] [line:57] [INFO] [info_message...]
[2017-11-23 16:42:55] [yan27.py] [line:58] [WARNING] [warning_message...]
[2017-11-23 16:42:55] [yan27.py] [line:59] [ERROR] [error_message...]
[2017-11-23 16:42:55] [yan27.py] [line:60] [CRITICAL] [critical_message...]
-
logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,常用的参数有:
-
level:设置日志级别
-
-
datefmt:设置日期时间格式
-
filename:指定日志输出的文件名,不指定输出到终端
-
filemode:指定日志文件的打开模式
-
stream:指定输出终端(默认的输出方式),如果指定了filename,则stream不生效
-
日志显示格式的格式化串:
-
%(name)s Logger的名字
-
%(levelno)s 数字形式的日志级别
-
%(levelname)s 文本形式的日志级别
-
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
-
%(filename)s 调用日志输出函数的模块的文件名
-
%(module)s 调用日志输出函数的模块名
-
%(funcName)s 调用日志输出函数的函数名
-
%(lineno)d 调用日志输出函数的语句所在的代码行
-
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
-
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
-
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
-
%(thread)d 线程ID。可能没有
-
%(threadName)s 线程名。可能没有
-
%(process)d 进程ID。可能没有
-
%(message)s用户输出的消息
-
高级模式
import logging
yy_Logger = logging.getLogger()
yy_Logger.setLevel(logging.INFO)
# 设置日志级别
# 实例化对象
f1 = logging.FileHandler('logging1.log', encoding='utf-8')
# 创建文件句柄
format1 = logging.Formatter('[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]')
# 指定日志输出格式
f1.setFormatter(format1)
# 关联文件句柄和日至格式
yy_Logger.addHandler(f1)
# 添加文件句柄到对象中
f2 = logging.FileHandler('logging2.log', encoding='utf-8')
format2 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
f2.setFormatter(format2)
yy_Logger.addHandler(f2)
s1 = logging.StreamHandler()
# 创建屏幕流对象
stream_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
s1.setFormatter(stream_format)
yy_Logger.addHandler(s1)
logging.debug('debug_message...')
logging.info('info_message...')
logging.warning('warning_message...')
logging.error('error_message...')
logging.critical('critical_message...')
>>>'终端输出内容'
2017-11-23 17:04:48,471 - root - INFO - info_message...
2017-11-23 17:04:48,471 - root - WARNING - warning_message...
2017-11-23 17:04:48,471 - root - ERROR - error_message...
2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
>>>'logging1.log文件内容'
[2017-11-23 17:04:48,471] [yan27.py] [line:90] [INFO] [info_message...]
[2017-11-23 17:04:48,471] [yan27.py] [line:91] [WARNING] [warning_message...]
[2017-11-23 17:04:48,471] [yan27.py] [line:92] [ERROR] [error_message...]
[2017-11-23 17:04:48,471] [yan27.py] [line:93] [CRITICAL] [critical_message...]
>>>'logging2.log文件内容'
2017-11-23 17:04:48,471 - root - INFO - info_message...
2017-11-23 17:04:48,471 - root - WARNING - warning_message...
2017-11-23 17:04:48,471 - root - ERROR - error_message...
2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
-
组件:
-
Logger:提供应用程序可直接使用的接口
-
Handler:指定日志输出的目的地
-
Filter:提供过滤日志信息的方法
-