如何将 Python 中的控制台打印到文件

How to print console in Python to a file

我正在为 Pyhton 使用 Spyder,但由于某些问题,IPython 控制台中的输出非常大(超过 10000 行),直接在 IPython 中分析输出非常低效] 安慰。这就是为什么我想知道是否有办法将输出打印到 .txt 文件?我尝试了这里的建议 How to write console output on text file。所以我在代码的开头使用:

import sys
sys.stdout = open('C:/Users/Python_Code/log.txt', 'w')

最后 sys.stdout.close()。但是,我收到一条错误消息,指出“值错误:I/O 对已关闭文件的操作”并且未创建 log.txt 文件。如果我在相应文件夹中手动创建 log.txt 文件,该文件仍为空。不仅文件为空,而且 Spyder 在执行此代码后根本没有反应,因此我必须将其关闭并重新启动。

您知道如何将控制台输出重定向到 txt 文件吗?我会感谢每一条评论,并感谢你的帮助。

关闭文件后输入sys.stdout = sys.__stdout__

有些东西仍在尝试写入控制台,因此您必须将其更改为系统标准输出以防止关闭后出错。如果您绝对必须捕获这些日志,则必须在命令行上使用 python file.py > output.txt

我没有看到深入 python 有一个明确的答案,但我想有一些保护措施可以防止您关闭与任何 stdout, stderr, stdin 相关联的基础流。所以解决方案是将 sys.stdout 临时保存到某个变量并在关闭前重新分配它。这是一个例子:

In [1]: import sys

In [2]: f = open('log.txt', 'w')

In [3]: temp = sys.stdout

In [4]: sys.stdout = f
In [5]: print("Hi")
In [6]: sys.stdout = temp

In [7]: f.close()

In [8]: !cat log.txt

Hi

或者以更优雅的方式(我会说这是 pythonic 的方式):

In [9]: from contextlib import redirect_stdout

In [10]: with open('log.txt', 'w') as f:
    ...:     with redirect_stdout(f):
    ...:         print("Hi again!")
    ...:

In [11]: !cat log.txt
Hi again!

如果您的代码使用 logging 模块,您可以 configure the handler 写入文件。

示例:

import logging.config

logging.config.dictConfig({ 
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': { 
        'standard': { 
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'handlers': { 
        'default': { 
            'level': 'INFO',
            'formatter': 'standard',
            'class': 'logging.FileHandler',
            'filename': 'error.log',
            'mode': 'a',
        },
    },
    'loggers': { 
        '': {  # root logger
            'handlers': ['default'],
            'level': 'WARNING',
            'propagate': False
        },
        'some.package': { 
            'handlers': ['default'],
            'level': 'INFO',
            'propagate': False
        }
    } 
})

最好的方法是使用 print("your output", file=...).

之类的东西

完整代码如下:

with open("output_text.txt", "w") as f:
    print("your output text ...", file=f)