python 信息同时输出到控制台与文件

本文介绍了三种在Python中实现信息同时输出到控制台与文件的方法:使用logging模块、print输出两次及输出重定向。适用于不同场景的需求。

python 信息同时输出到控制台与文件

python编程中,往往需要将结果用print等输出,如果希望输出既可以显示到IDE的屏幕上,也能存到文件中(如txt)中,该怎么办呢?


方法1

可通过日志logging模块输出信息到文件或屏幕。但可能要设置log的level或输出端,对于同时需要记录debug error等信息的较为合适,官方教程推荐学习用更规范的logger来操作。
例如,可参考来自官网的这段代码。

import logging
logging.basicConfig(filename='log_examp.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

方法2

利用print输出两次
比如这里我想输出程序的path和程序的文件名

import os
# 第一句输出到consle:
print("filepath:",__file__,"\nfilename:",os.path.basename(__file__))
# 第二句输出到txt:
with open("outputlog.txt","a+") as f:
    print("filepath:",__file__,
    "\nfilename:",os.path.basename(__file__),file = f)
    #当然 也可以用f.write("info")的方式写入文件

方法3

利用输出重定向输出两次
同样输出程序path和文件名

import os
import sys

temp=sys.stdout # 记录当前输出指向,默认是consle

with open("outputlog.txt","a+") as f:
    sys.stdout=f   # 输出指向txt文件
    print("filepath:",__file__,
    "\nfilename:",os.path.basename(__file__))
    print("some other information")
    print("some other")
    print("information")
    sys.stdout=temp # 输出重定向回consle
    print(f.readlines()) # 将记录在文件中的结果输出到屏幕

R的重定向

这里多嘴补充一下,在windows下的R语言中,有个sink(‘文件名.后缀名’) 可以将输出重定向到文件中,然后用sink()重返控制台 很是方便

Python中,`logging`模块用于记录应用程序的日志信息。如果你发现日志没有输出控制台,可能是以下几个原因: 1. **配置文件设置**:默认情况下,`logging`会将错误级别及以上的消息打印到控制台。检查你的`logging.config`或者`.loggin.ini`文件中是否指定了控制台处理器(`StreamHandler`)及其设置。 2. **handler的添加**:确认你是否有在logger上添加控制台处理器(`logging.basicConfig()`函数通常会自动添加)。如果没有,需要手动添加`logging.StreamHandler()`, 并设置相应的level(如debug、info等)。 3. **过滤器设置**:检查是否有特定的filter阻止了某些日志级别或特定关键字的消息输出控制台。 4. **环境变量影响**:有些时候,如果设置了环境变量`LOGGING_TO_CONSOLE=False`,可能会禁用控制台输出。请确认你的应用环境中没有这样的设定。 5. **异常处理**:如果在尝试写入控制台时出现了异常,比如权限不足,日志可能不会显示出来。检查相关部分的代码,看是否有异常发生并妥善处理。 要解决这个问题,你可以尝试运行以下基本示例,看看控制台是否能接收到日志输出: ```python import logging # 创建一个logger实例 logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 添加一个到控制台的handler console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) logger.addHandler(console_handler) # 开始记录 logger.info('This is a log message.') ``` 如果上述代码在你的环境下无法正常工作,那么检查上述提到的问题,找出具体原因。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值