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
-
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:设置日志级别
-
format:设置日志显示格式
-
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:提供过滤日志信息的方法
-
Formatter:指定日志显示格式
-
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:设置日志级别
-
format:设置日志显示格式
-
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:提供过滤日志信息的方法
-
Formatter:指定日志显示格式
-