常用模块整理

time:时间模块

'''
时间戳(timestamp):time.time()
延迟线程的运行:time.sleep(secs)
(指定时间戳下的)格林威治时间:time.gmtime([secs])
(指定时间元组下的)格式化时间:time.strftime(fmt[tupletime])
'''
'''
%Y 四位数的年份表示
%y 二位数的年份表示
%m 月份
%d 月内中的一天
%H 24小时制小时数
%I 12小时制小时数
%M 分钟数
%S 秒
%a 本地简化星期名称
%A 本地完成星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天
%w 一年中的星期数
'''
View Code

 

calendar:日历

'''
判断闰年:calendar.isleap(yera)
查看某年某月日历:calendar.monthrange(year,month)
查看某年某月某日其实星期与当月天数:calendar.monthrange(year,month)
查看某年某月某日是星期几:calendar.weekday(year,month,day)
'''

datatime:可以运算的时间

'''
当天时间:datetime.datetime.now()
昨天:datatime.datetime.now() +
datatime.timedelta(day=-1)
修改时间:datatime_obj.replace([])
格式化时间戳:datetime.data.frominestamp(timestamp)
'''

sys:系统

'''
命令行参数list,第一个元素是程序本身路径:sys.argv
退出程序,正常退出时exit(0):sys.exit(n)
获取python解释程序的版本信息:sys.version
最大int值:sya.maxsize  \py2中为 sys.maxint
环境变量:sys.path
操作系统平台名称:sys.platform
'''

os:操作系统

'''
生成单级目录:os.mkdir('dirname')
生成多级目录:os.makedirs('dirname1\...\dirname2')
重命名:os.rename('oldname','newname')
工作目录:os.getcwd()
删除单层空目录:os.rmdir('dirname')
移除多层空目录:os.renmovedirs('dirname1\...\dirname2')
列举目录下所有资源:os.listdir('dirname')
路径分隔符:os.sep
行终止符:os.linesep
文件分隔符:os.pathsep
操作系统名:os.name
操作系统环境变量:os.environ
执行shell脚本:os.system()
'''
View Code

 

os.path:系统路径操作:

'''
执行文件的当前路径:__file__
返回path规范化的绝对路径:os.path.abspath(path)  
将path分割成目录和文件名二元组返回:os.path.split(path)  
上一级目录:os.path.dirname(path) 
最后一级名称:os.path.basename(path)
指定路径是否存在:os.path.exists(path)
是否是绝对路径:os.path.isabs(path)
是否是文件:os.path.isfile(path)
是否是路径:os.path.isdir(path) 
路径拼接:os.path.join(path1[, path2[, ...]])
最后存取时间:os.path.getatime(path)
最后修改时间:os.path.getmtime(path)
目标大小:os.path.getsize(path)
'''

random:随机数

'''
(0, 1):random.random()
[1, 10]:random.randint(1, 10)
[1, 10):random.randrange(1, 10)
(1, 10):random.uniform(1, 10)
单例集合随机选择1个:random.choice(item)
单例集合随机选择n个:random.sample(item, n)
洗牌单列集合:random.shuffle(item)
'''

 

 

json:序列化

# json: {} 与 [] 嵌套的数据
# 注:json中的字符串必须全部用""来标识
'''
序列化:对象 => 字符串
序列化成字符串:json.dumps(json_obj)
序列化字符串到文件中:json.dump(json_obj, write_file)

# 注:字符形式操作
反序列化成对象:json.loads(json_str)
从文件读流中反序列化成对象:json.load(read_file)
'''

pickle:序列化

'''
序列化:对象 => 字符串
序列化成字符串:pickle.dumps(obj)
序列化字符串到文件中:pickle.dump(obj, write_bytes_file)

# 注:字节形式操作
反序列化成对象:pickle.loads(bytes_str)
从文件读流中反序列化成对象:pickle.load(read_bytes_file)
''

shutil:可以操作权限的处理文件模块

# 基于路径的文件复制:
shutil.copyfile('source_file', 'target_file')

# 基于流的文件复制:
with open('source_file', 'rb') as r, open('target_file', 'wb') as w:
    shutil.copyfileobj(r, w)
    
# 递归删除目标目录
shutil.rmtree('target_folder')

# 文件移动
shutil.remove('old_file', 'new_file')

# 文件夹压缩
shutil.make_archive('file_name', 'format', 'archive_path')

# 文件夹解压
shutil.unpack_archive('unpack_file', 'unpack_name', 'format')
View Code

shevle:可以用字典存取数据到文件的序列化模块

 

# 将序列化文件操作dump与load进行封装
s_dic = shelve.open("target_file", writeback=True)  # 注:writeback允许序列化的可变类型,可以直接修改值
# 序列化::存
s_dic['key1'] = 'value1'
s_dic['key2'] = 'value2'
# 反序列化:取
print(s_dic['key1'])
# 文件这样的释放
s_dic.close()
View Code

 

hashlib模块:加密

import hashlib
# 基本使用
cipher = hashlib.md5('需要加密的数据的二进制形式'.encode('utf-8'))
print(cipher.hexdigest())  # 加密结果码

# 加盐
cipher = hashlib.md5()
cipher.update('前盐'.encode('utf-8'))
cipher.update('需要加密的数据'.encode('utf-8'))
cipher.update('后盐'.encode('utf-8'))
print(cipher.hexdigest())  # 加密结果码

# 其他算法
cipher = hashlib.sha3_256(b'')
print(cipher.hexdigest())
cipher = hashlib.sha3_512(b'')
print(cipher.hexdigest())
View Code

hmac模块:加密

# 必须加盐
cipher = hmac.new(''.encode('utf-8'))
cipher.update('数据'.encode('utf-8'))
print(cipher.hexdigest())

subprocess模块:操作shell命令:

#linux操作系统使用
import subprocess
order = subprocess.Popen('终端命令', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
suc_res = order.stdout.read().decode('系统默认编码')
err_res = order.stderr.read().decode('系统默认编码')

order = subprocess.run('终端命令', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
suc_res = order.stdout.decode('系统默认编码')
err_res = order.stderr.decode('系统默认编码')
View Code

xlrd模块:excel读

import xlrd
# 读取文件
work_book = xlrd.open_workbook("机密数据.xlsx")
# 获取所有所有表格名称
print(work_book.sheet_names())
# 选取一个表
sheet = work_book.sheet_by_index(1)
# 表格名称
print(sheet.name)
# 行数
print(sheet.nrows)
# 列数
print(sheet.ncols)
# 某行全部
print(sheet.row(6))
# 某列全部
print(sheet.col(6))
# 某行列区间
print(sheet.row_slice(6, start_colx=0, end_colx=4))
# 某列行区间
print(sheet.col_slice(3, start_colx=3, end_colx=6))
# 某行类型 | 值
print(sheet.row_types(6), sheet.row_values(6))
# 单元格
print(sheet.cell(6,0).value) # 取值
print(sheet.cell(6,0).ctype) # 取类型
print(sheet.cell_value(6,0)) # 直接取值
print(sheet.row(6)[0])
# 时间格式转换
print(xlrd.xldate_as_datetime(sheet.cell(6, 0).value, 0))
View Code

xlwt模块:excel写

import xlwt
# 创建工作簿
work = xlwt.Workbook()
# 创建一个表
sheet = work.add_sheet("员工信息数据")
# 创建一个字体对象
font = xlwt.Font()
font.name = "Times New Roman"  # 字体名称
font.bold = True  # 加粗
font.italic = True  # 斜体
font.underline = True  # 下划线
# 创建一个样式对象
style = xlwt.XFStyle()
style.font = font
keys = ['Owen', 'Zero', 'Egon', 'Liuxx', 'Yhh']
# 写入标题
for k in keys:
    sheet.write(0, keys.index(k), k, style)
# 写入数据
sheet.write(1, 0, 'cool', style)
# 保存至文件
work.save("test.xls")
View Code

xml模块

<?xml version="1.0"?><data>    <country name="Liechtenstein">        <rank updated="yes">2</rank>        <year>2008</year>        <gdppc>141100</gdppc>        <neighbor name="Austria" direction="E"/>        <neighbor name="Switzerland" direction="W"/>    </country>    <country name="Singapore">        <rank updated="yes">5</rank>        <year>2011</year>        <gdppc>59900</gdppc>        <neighbor name="Malaysia" direction="N"/>    </country>    <country name="Panama">        <rank updated="yes">69</rank>        <year>2011</year>        <gdppc>13600</gdppc>        <neighbor name="Costa Rica" direction="W"/>        <neighbor name="Colombia" direction="E"/>    </country></data>​import xml.etree.ElementTree as ET# 读文件tree = ET.parse("xmltest.xml")# 根节点root_ele = tree.getroot()# 遍历下一级for ele in root_ele:    print(ele)    # 全文搜索指定名的子标签ele.iter("标签名")# 非全文查找满足条件的第一个子标签ele.find("标签名")# 非全文查找满足条件的所有子标签ele.findall("标签名")​# 标签名ele.tag# 标签内容ele.text# 标签属性ele.attrib​# 修改ele.tag = "新标签名"ele.text = "新文本"ele.set("属性名", "新属性值")​# 删除sup_ele.remove(sub_ele)​# 添加my_ele=ET.Element('myEle')my_ele.text = 'new_ele' my_ele.attrib = {'name': 'my_ele'}root.append(my_ele)​# 重新写入硬盘tree.write("xmltest.xml")
View Code

 

 

logging模块

 

什么是logging模块

 

logging模块是python提供的用于记录日志的模块

 

为什么需要logging

 

我们完全可以自己打开文件然后,日志写进去,但是这些操作重复且没有任何技术含量,所以python帮我们进行了封装,有了logging后我们在记录日志时 只需要简单的调用接口即可,非常方便!

 

日志级别

 

在开始记录日志前还需要明确,日志的级别

 

随着时间的推移,日志记录会非常多,成千上万行,如何快速找到需要的日志记录这就成了问题

 

解决的方案就是 给日志划分级别

 

logging模块将日志分为了五个级别,从高到低分别是:

 

1.info 常规信息

 

2.debug 调试信息

 

3.warning 警告信息

 

4.error 错误信息

 

5.cretical 严重错误

 

本质上他们使用数字来表示级别的,从高到低分别是10,20,30,40,50

 

logging模块的使用:

#1.导入模块
import logging

#2.输出日志
logging.info("info")
logging.debug("debug")
logging.warning("warning")
logging.error("error")
logging.critical("critical")

#输出 WARNING:root:warning
#输出 ERROR:root:error
#输出 CRITICAL:root:critical

我们发现info 和 debug都没有输出,这是因为它们的级别不够,

默认情况下:

logging的最低显示级别为warning,对应的数值为30

日志被打印到了控制台

日志输出格式为:级别 日志生成器名称 日志消息

自定义配置:

import logging
logging.basicConfig()

"""可用参数
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。 
datefmt:指定日期时间格式。 
level:设置rootlogger(后边会讲解具体概念)的日志级别 
"""

#案例:
logging.basicConfig(
    filename="aaa.log",
    filemode="at",
    datefmt="%Y-%m-%d %H:%M:%S %p",
    format="%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s",
    level=10
)
View Code

格式化全部可用名称:

'''
%(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:用户输出的消息
'''

 

 

logging模块的四个核心角色:

 

1.Logger 日志生成器 产生日志

 

2.Filter 日志过滤器 过滤日志

 

3.Handler 日志处理器 对日志进行格式化,并输出到指定位置(控制台或文件)

 

4.Formater 处理日志的格式

日志模板:

import logging.config
logging.config.dictConfig(LOGGING_DIC)
logging.getLogger("aa").debug("测试")

#LOGGING_DIC模板
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字 

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
logfile_path = "配置文件路径"

LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},
    'handlers': {
        #打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        #打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            'maxBytes': 1024*1024*5,  # 日志大小 5M
            'backupCount': 5, #日志文件最大个数
            'encoding': 'utf-8',  # 日志文件的编码
        },
    },
    'loggers': {
        #logging.getLogger(__name__)拿到的logger配置
        'aa': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG',
            'propagate': True,  # 向上(更高level的logger)传递
        },
    },
}
#888888888888888888888888888888888888888888888888888888888888888888888
# 程序员看的格式
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
logfile_path1 = "coder.log"

# 老板看的格式
simple_format = '[%(levelname)s][%(asctime)s]%(message)s'
logfile_path2 = "boss.log"


LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},
    'handlers': {
        #打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        #打印到文件的日志,收集info及以上的日志
        'std': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': logfile_path1,  # 日志文件
            'maxBytes': 1024*1024*5,  # 日志大小 5M
            'backupCount': 5, #日志文件最大个数
            'encoding': 'utf-8',  # 日志文件的编码
        },
        'boss': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'simple',
            'filename': logfile_path2,  # 日志文件
            'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
            'backupCount': 5,  # 日志文件最大个数
            'encoding': 'utf-8',  # 日志文件的编码
        }
    },
    'loggers': {
        #logging.getLogger(__name__)拿到的logger配置
        'aa': {
            'handlers': ['std', 'console',"boss"],  # 这里把上面定义的handler都加上,即log数据会同时输出到三个位置
            'level': 'INFO',
            'propagate': True,  # 向上(更高level的logger)传递
        },
    },
}
View Code

 

posted @ 2019-04-29 15:23  明天的世界  阅读(239)  评论(0编辑  收藏  举报
ヾ(≧O≦)〃嗷~