#******************************* 静态导入模块 *********************************************
#1、导入模块,会将模块下的所有语句执行一遍
#2、仅导入module模块的add函数,其他的函数均不导入,提高效率,使用时直接调用add函数
from module import add
add(2,3)
from module import add as plus#将导入的add函数名重命名为plus函数
plus(2,3)
#3、模块完全导入,使用模块的函数时需要带模块名
import module #导入module模块
module.add(2,3)
#4、包package:模块是函数的集合,包是模块的集合;包通过__init__.py文件区别于文件夹
#若web是个包,导入包只执行__init__.py文件,并不能执行其包下的模块
import web
#若web包下有logger模块,则与web同级的模块调用web下的logger模块的正确方式
from web import logger
logger.logger()#调用web包下的logger模块的logger函数
#调用web包下的web2包下的logger模块
from web.web2 import logger
logger.logger()#调用logger模块的logger函数
#调用web包下的web2包下的logger模块的logger函数
from web.web2.logger import logger
logger()#调用logger函数
#4、项目执行标准格式
bin#bin包,总执行入口
__init__.py
bin.py
conf#conf包,配置类
__init__.py
conf.py
web#web包,业务类
__init__.py
web.py
main#main包,主程序,即有总执行入口调用本模块
__init__.py
main.py
上述包调用需要特别注意在bin.py总程序入口中添加本项目的环境变量
添加方式:
1、通过os.path.abspath(__file__)获取文件的绝对路径
2、在通过os.path.basename()获取到绝对路径对应的项目主路径,即BASE_DIR
3、通过sys.path.append(BASE_DIR)将项目路径添加到环境变量,项目移植,包间调用都可以正常执行
#******************************* 动态导入模块 *********************************************
通过字符串的形式来导入模块和执行函数
import importlib
module = "src.module" #需要导入的src目录下的module模块
func_name = "add"
m = importlib.import_module(module)
func = m.getattr(m, func_name)#通过反射获取module下的add函数
func()#执行add函数
#******************************* ConfigParser模块模块 *********************************************
#=================== 1、存储样式 ===================
[DEFAULT]
compression = yes
compressionlevel = 9
[server]
host port = 50022
forwardx11 = no
[bitbucket.org]
Port = 50022
ForwardX11 = no
#=================== 2、读取配置文件 ===================
import configparser
config = configparser.ConfigParser()#创建配置文件操作对象
config.read('example.ini', encoding='utf-8-sig')#读取配置文件,编码防止中文乱码
print(config.sections())#输出配置节点信息['server', 'bitbucket.org'],不包含DEFAULT模块
print(config.options('server'))#输出节点下的所有key
print(config.defaults())#输出DEFAULT节点信息{'compression': 'yes', 'compressionlevel': '9'}
print('server' in config)#判断server节点是否在配置文件中:True
print(config['server']['host port'])#读取键值对:50022
for key in config['server']:#循环server节点的key值,同时会自动将DEFAULT节点的内容也打印
print(key)# 输出结果
# host port
# forwardx11
# compression
# compressionlevel
》添加
config.add_section('home')#添加节点
config.set('home','address','beijing')#添加参数
》删除
config.remove_section('bitbucket.org')#删除节点
config.remove_option('server', 'forwardx11')#删除节点下的参数
》修改
config.set('server', 'forwardx11', 'yes')#修改节点内容:节点、键、值
》查找
print(config.has_section('bitbucket.org'))#查询节点:False
print(config.has_option(section, 'bitbucket.org'))#查询参数:False
config.write(open('conf.ini','w'))#修改后保存新文件
#=================== 3、创建配置文件 ===================
import configparser
config = configparser.ConfigParser()#配置文件对象
######### 创建配置文件信息 #########
config["DEFAULT"] = {
'Compression': 'yes',
'CompressionLevel': '9'
}
config['server'] = {}
config['server']['Host Port'] = '50022' # mutates the parser
config['server']['ForwardX11'] = 'no' # same here
######### 记录配置文件信息 #########
with open('example.ini', 'w', encoding='utf8') as fp:
config.write(configfile)
config.write(fp)
#******************************* os模块 *********************************************
print(os.getcwd())#获取当前工作路径,即当前python脚本工作的目录路径
print(os.chdir(''))#获取当前工作路径
os.curdir# 返回当前目录: ('.')
os.pardir# 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2')#可生成多层递归目录
os.removedirs('dirname1')#若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')#生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')#删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')#列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()#删除一个文件
os.rename("oldname","newname")#重命名文件/目录
os.stat('path/filename')#获取文件/目录信息
os.sep#输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep#输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep#输出用于分割文件路径的字符串
os.name#输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")#运行shell命令,直接显示
os.environ#获取系统环境变量
os.path.abspath(path)#返回path规范化的绝对路径
os.path.split(path)#将path分割成目录和文件名二元组返回
os.path.dirname(path)#返回path的父目录或文件的所在目录
os.path.basename(path)#返回path后的文件名。
os.path.exists(path)#如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)#如果path是绝对路径,返回True
os.path.isfile(file)#如果file是一个存在的文件,返回True。否则返回False
os.path.isdir(path)#如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])#将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)#返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)#返回path所指向的文件或者目录的最后修改时间
#******************************* sys模块 *********************************************
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]
#******************************* datetime模块 *********************************************
import time
print(help(time))#输出time模块的所有信息
print(time.time())#输出时间戳
time.sleep(3)#睡眠3秒钟
print(time.gmtime())#输出世界时结构体
print(time.localtime())#输出本地时间结构体
#*********时间戳格式化输出**********
print(time.strftime('%Y-%m-%d %H:%M:%S'))#2022-01-19 22:21:02
time.strftime('%Y/%m/%d %H:%M:%S',time.strptime(fileInfo['fileTime'], '%Y%m%d%H'))#时间字符串20220119转2022/01/19 00:00:00
#*********时间字符串转时间**********
print(time.strptime('2022-01-19 22:23:34','%Y-%m-%d %H:%M:%S'))
print(time.ctime(1438348935893))#将时间戳转为内部固定格式的时间
print(time.mktime(time.localtime()))#将时间结构体转为时间戳
import datetime
print(datetime.datetime.now())#2022-01-19 22:38:13.351363
print(datetime.datetime.strptime('2022-01-19 22:23:34','%Y-%m-%d %H:%M:%S'))
fcstDay = (datetime.date.today() + datetime.timedelta(days= 1)).strftime("%Y%m%d")
print ((datetime.datetime.strptime('2022-01-19 22:23:34','%Y-%m-%d %H:%M:%S')+datetime.timedelta(days= 1)).strftime("%Y%m%d"))
#******************************* random模块 *********************************************
import random
print(random.random())#0.9775188282747094
print(random.randint(1,5))#输出[1,5]包括边界的随机整数值
print(random.choice('alex'))#输出字符串中的随机一个字符
print(random.choice([1,2,3,[4,5]]))#输出列表中的随机一个元素
print(random.sample([1,2,3,4,5], 3))#从列表中随机选出3个元素
print(random.randrange(1,8))#随机输出[1,8)之间的一个整数值,左闭右开区间
#******************************* hashlib模块 *********************************************
1、md5算法:python3中字符串为Unicode编码,md5只支持byte类型,需要decode转为utf8编码
m = hashlib.md5()#创建MD5对象
print(m)#<md5 HASH object @ 0x000001A19C7CAE90>
m.update('hello world'.encode('utf8'))#对字符串进行加密
print(m.hexdigest())#取加密后的十六进制结果
m.update('alex'.encode('utf8'))#追加字符串加密,即对hello worldalex编码;每次实例化一次对象可对字符串单独加密
print(m.hexdigest())#对hello worldalex字符串进行十六进制加密
2、sha256算法:过程与md5类型
m = hashlib.sha3_256()#创建sha3_256对象
print(m)#<_sha3.sha3_256 object at 0x00000169EE8A3B30>
m.update('hello world'.encode('utf8'))#对字符串进行加密
print(m.hexdigest())#取加密后的十六进制结果
#******************************* logger模块 *********************************************
import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')#WARNING:root:warning message
logging.error('error message')#ERROR:root:error message
logging.critical('critical message')#CRITICAL:root:critical message
#说明:日志默认输出为WARNING级别,所以WARNING级别以上可输出。
#日记级别:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
import logging
logging.basicConfig(
level=logging.DEBUG,
#时间格式 脚本名称 错误行号 错误级别 错误信息
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S', #对应上面的时间格式参数
filename='/tmp/test.log',#日志文件;若无该参数则默认输出到屏幕
filemode='w') #记录到文件需要写模式
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
#=================== 1、logging.basicConfig()函数参数详解 ===================
filename:用指定的文件记录日志。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定日志记录格式,即时间 脚本 行数 信息等日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open('test.log','w')),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
format参数中可能用到的格式化串:
%(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用户输出的消息
#=================== 2、logging文件屏幕双输出 ===================
import logging
logger = logging.getLogger()#创建logging日志对象
fh = logging.FileHandler('test.log')# 创建一个文件对象,用于写入日志文件
ch = logging.StreamHandler()# 再创建一个handler,用于输出到控制台屏幕
#创建记录格式对象
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)#设置文件对象的记录格式
ch.setFormatter(formatter)#设置屏幕对象的记录格式
logger.addHandler(fh) #日志对象添加文件输出对象
logger.addHandler(ch) #日志对象添加屏幕输出对象
logger.setLevel(logging.DEBUG)#调整日出输出级别
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')
#=================== 3、logging初始化应用 ===================
def get_logger():
file_handler = logging.FileHandler('log.txt', encoding='utf-8')
fmt = logging.Formatter(fmt="%(asctime)s : %(message)s")
file_handler.setFormatter(fmt)
logger1 = logging.Logger('user_logger', level=logging.INFO)
logger1.addHandler(file_handler)
return logger1
#******************************* subprocess子进程模块 *********************************************
import subprocess
#创建子进程对象,dir为待执行命令,执行结果通过子进程管道存储到对象中
obj = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
print(str(obj.stdout.read(),'gbk'))#子进程执行结果为byte类型,含中文需要转为gbk编码