模块

#******************************* 静态导入模块 *********************************************
#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编码




 
 

 

posted @ 2022-11-17 22:08  大碗麻辣烫  阅读(98)  评论(0)    收藏  举报