还在用分割字符获取文件名等信息吗?

Posted object0812

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了还在用分割字符获取文件名等信息吗?相关的知识,希望对你有一定的参考价值。

string filespath = @"D:\\Files\\测试文件.doc";
 
string strFilename = Path.GetFileName(filespath);//返回完整的文件名 测试文件.doc
Response.Write("返回完整的文件名:" + strFilename+"<br />");
 
string extension = Path.GetExtension(filespath);//返回文件扩展名 .doc
Response.Write("文件扩展名:" + extension + "<br />");
 
string strFileNameWithoutExtension = Path.GetFileNameWithoutExtension(filespath);// 没有扩展名的文件名 "测试文件"
Response.Write("没有扩展名的文件名:" + strFileNameWithoutExtension + "<br />");
 
string dirPath = Path.GetDirectoryName(filespath); //返回文件所在目录 D:\\Files
Response.Write("返回文件所在目录:" + dirPath + "<br />");
 
string filespath1 = Path.Combine(@"D:\\Files", "测试文件.doc");  //返回拼接完整的路径 D:\\Files\\测试文件.doc
Response.Write("路径合成:" + filespath1 + "<br />");
 
string filespath2 = Path.GetFullPath("测试文件.doc");//返回指定路径字符串的绝对路径
Response.Write("返回指定路径字符串的绝对路径:" + filespath2);

返回完整的文件名:测试文件.doc
文件扩展名:.doc
没有扩展名的文件名:测试文件
返回文件所在目录:D:\\Files
路径合成:D:\\Files\\测试文件.doc
返回指定路径字符串的绝对路径:C:\\Program Files\\IIS Express\\测试文件.doc

你还在用print调试程序吗?太low了

前言

你还在用print来调试程序吗?当我们的程序较为简单,只需在控制台上输出一些信息时,使用print来打印一些信息来帮我们调试程序,这无可厚非。但是当我们的项目很复杂,需要在很多个地方输出一些信息,包括在文件中等地方,使用很多个print会显得自己很不专业。日志是每个项目中不可缺少的部分,重要性不言而喻。使用日志的目的有三,其一,使用日志可以帮助我们调试程序;其二,日志信息可以快速帮助我们定位出错误;其三,使用日志可以帮我们记录一些数据,以便后期的数据分析。

一、logging的基础使用

1.1 基础知识

级别级别数值使用时机
DEBUG10详细信息,常用于调试
INFO20程序正常运行过程中产生的一些信息
WARNING30警告用户,虽然程序还在正常工作,但有可能发生错误
ERROR40由于更严重的问题,程序已经不能执行一些任务
CRITICAL50严重错误,程序已经不能继续运行

优先级为:CRITICAL > ERROR > WARNING > INFO > DEBUG
默认的日志级别为WARRING,即DEBUG和INFO的输出信息不会输出,只会输出CRITICAL、 EROOR和WARNING信息

1.2 案例1

# 导包
import logging

logging.DEBUG('debug')
logging.INFO('info')
logging.WARNING('warning')
logging.ERROR('error')
logging.CRITICAL('critical')

1.3 案例2 --指定日志的输出级别

# 导包
import logging
# 指定日志的级别
logging.basicConfig(level=logging.INFO)
logging.DEBUG('debug')
logging.INFO('info')
logging.WARNING('warning')
logging.ERROR('error')
logging.CRITICAL('critical')

1.4 案例3–向文件中写入日志信息

import logging
# 默认为追加模式
logging.basicConfig(filename='demo.log', level=logging.DEBUG)
# 更改写入模式:该模型为先清空文件内容,然后写入新内容
logging.basicConfig(filename='demo.log','w',level=logging.DEBUG)
logging.DEBUG('debug')
logging.INFO('info')
logging.WARNING('warning')
logging.ERROR('error')
logging.CRITICAL('critical')

首先会创建‘demo.log’文件,然后写入日志信息。

1.5 案例4–日志输出变量信息

import logging
name = 'djk'
age = 12
logging.basicConfig(level=logging.DEBUG)
# 格式化变量的几种方式
logging.debug('姓名 %s 年龄 %d', name,age)
logging.debug('姓名 %s 年龄 %d'% (name,age))
logging.debug('姓名  年龄 '.format(name,age))
logging.debug(f'姓名 name 年龄 age')

1.6 案例5–日志信息格式化

import logging
logging.basicConfig(fotmat='#(asctime)s|%(levelname)s|%(lineno)s|%(message)s', datefmt ='%Y %m %d %H %M %S',level=logging.DEBUG)

这样,输出的日志信息就能按照我们自己的意愿来输出对应的信息了。

二、编程式方法实现日志应用

logging模块采用了模块化设计,主要包含四种组件:

  • Loggers:记录器,提供应用程序代码能直接使用的接口
  • Handles:处理器,将记录器产生的日志发送至目的地
  • Filters:过滤器,提供更好的粒度控制,决定哪些日志会被输出
  • Formatters:格式化器,设置日志内容的组成结构和消息字段

步骤:

  • 1.创建一个logger并设置默认等级
  • 2.创建Handler,并设置日志级别。值得注意的是:一个logger可以有多个handler
  • 3.自定义日志格式
  • 4.为记录器设置日志格式
  • 5.为处理器设置日志格式
  • 6.关联记录器和处理器
  • 7.(非必需)创建一个Filter
  • 8.关联Logger和Filter
  • 9.关联Handler和Filter

import logging
# 1.创建记录器并设置日志级别
logger = logging.getLogger('applog')  # 创建一个记录,名字为applog
logging.basicConfig(level=logging.DEBUG)  # 指定记录器的日志级别
# 2.定义处理器及设置日志级别
consolehandler = logging.StreamHandler()  # 创建一个控制台处理器
consolehandler.setLevel(logging.DEBUG)
filehandler = logging.FileHandler(filename='demo.log')
filehandler.setLevel(logging.DEBUG)
# 3.设置日志输出格式
formatter = logging.Formattter('%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s')  # 创建日志格式
# 4.为处理器设置日志格式
consolehandler.setFormatter(formatter)
filehandler.setFormatter(formatter)
# 5.关联记录器和处理器
logger.addHandler(consolehandler)
logger.addHandler(filehandler)
# 6.定义Filter
flt = logging.FileHandler('demo')
# 7.关联记录器和过滤器
logger.addFilter(flt)
# 8.关联处理器和过滤器
consolehandler.addFilter(flt)
filehandler.addFiliter(flt)
# 9.这里是logger这个对象,并不是logging这个库了
logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')

Formatters的常用格式

属性格式描述
asctime%(asctime)s日志产生的时间,默认格式为2021-11-27 20:53:45, 896
filename%(filename)s生成日志的程序名
levelname%(levelname)s当前日志级别
levelno%(levelno)s日志级别对应的数值
lineno%(lineno)s日志所针对的代码行号
message%(message)s具体的日志信息

当然还有其它的格式,但是目前来说用不着,为简洁,故本文中没有出现,大家可以根据自己的需求进行查询。

三、 配置文件的方式实现日志设置

首先,我们需要先配置一个日志文件,命名为logging.config,如下所示:

[loggers]
keys=root,applog

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_applog]
level=DEBUG
handlers=fileHandler,consoleHandler
qualname=applog
propagate=0

[handler_consoleHandler]
class=StreamHandler
args=(sys.stdout,)
level=DEBUG
formatters=simpleFormatter

[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
args=('applog.log','midnight',1,0)
level=DEBUG
formatters=simpleFormatter

[formatter_simpleFormatter]
format=%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s
datafmt=%Y-%m-%d %H:%M:%S
import logging.config
# 导入该日志配置文件
logging.config.fileConfig('demo.log')  
logger = logging.getLogger('applog') # 创建一个名为applog的Logger
logger.debug('你学会了吗?')

案例

下面,我们使用一个简单的案例来讲解一下日志具体是如何使用的!假设,我输入下面的语句:

name='djk'
int(name)

如果单纯的运行以上这两条语句,很明显会出现以下错误:

但我们如果使用日志:

import logging
logger = logging.getLogger('applog')
name='djk'
try:
	int(djk)
catch Exception as e:
	logger.exception(e)


可以看到,已经记录到日志中。

以上是关于还在用分割字符获取文件名等信息吗?的主要内容,如果未能解决你的问题,请参考以下文章

你还在用print调试程序吗?太low了

你还在用print调试程序吗?太low了

你还在用print调试程序吗?太low了

你还在用print调试程序吗?太low了

还在用Excel维护客户信息?你OUT了

还在用Excel维护客户信息?你OUT了