![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
''' 时间戳(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 一年中的星期数 '''
'''
判断闰年:calendar.isleap(yera)
查看某年某月日历:calendar.monthrange(year,month)
查看某年某月某日其实星期与当月天数:calendar.monthrange(year,month)
查看某年某月某日是星期几:calendar.weekday(year,month,day)
'''
''' 当天时间:datetime.datetime.now() 昨天:datatime.datetime.now() + datatime.timedelta(day=-1) 修改时间:datatime_obj.replace([]) 格式化时间戳:datetime.data.frominestamp(timestamp) '''
''' 命令行参数list,第一个元素是程序本身路径:sys.argv 退出程序,正常退出时exit(0):sys.exit(n) 获取python解释程序的版本信息:sys.version 最大int值:sya.maxsize \py2中为 sys.maxint 环境变量:sys.path 操作系统平台名称:sys.platform '''
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
''' 生成单级目录: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() '''
''' 执行文件的当前路径:__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) '''
''' (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.dumps(json_obj) 序列化字符串到文件中:json.dump(json_obj, write_file) # 注:字符形式操作 反序列化成对象:json.loads(json_str) 从文件读流中反序列化成对象:json.load(read_file) '''
''' 序列化:对象 => 字符串 序列化成字符串:pickle.dumps(obj) 序列化字符串到文件中:pickle.dump(obj, write_bytes_file) # 注:字节形式操作 反序列化成对象:pickle.loads(bytes_str) 从文件读流中反序列化成对象:pickle.load(read_bytes_file) ''
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 基于路径的文件复制: 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')
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 将序列化文件操作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()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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())
# 必须加盐 cipher = hmac.new('盐'.encode('utf-8')) cipher.update('数据'.encode('utf-8')) print(cipher.hexdigest())
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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('系统默认编码')
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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")
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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")
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
日志被打印到了控制台
日志输出格式为:级别 日志生成器名称 日志消息
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 )
'''
%(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 处理日志的格式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)传递 }, }, }