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

Posted

技术标签:

【中文标题】如何在 Python 中将控制台打印到文件中【英文标题】:How to print console in Python to a file 【发布时间】:2021-08-26 11:48:25 【问题描述】:

我正在为 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 文件吗?感谢您的每一条评论,并感谢您的帮助。

【问题讨论】:

见here python your_script.py > your_file.txt 怎么样? 看看在关闭文件后输入sys.stdout = sys.__stdout__ 是否有任何不同。听起来有些东西在您关闭后仍在尝试写入控制台,如果它是非关键的或您无法控制它,则可以将其重定向到普通控制台以避免错误。 【参考方案1】:

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

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

【讨论】:

感谢您的回答。基本上它有效。但是现在控制台上什么都没有打印。除了文件之外,还有没有办法将特殊输出(不是全部)也打印到控制台? 对我上一条评论有什么意见吗?我非常感谢您的每进一步评论。 按照下面的答案查看logging。它具有多层日志记录,您可以手动过滤(调试、错误等)。它具有写入控制台和文件的功能。 请注意,如果您想要最少的自定义,则可以使用比其他注释少得多的代码来完成此操作:logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) 感谢您的回答。我赞成并接受了你的回答。非常感谢您的帮助。【参考方案2】:

我没有看到对 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!

【讨论】:

【参考方案3】:

如果您的代码使用logging 模块,您可以将configure 和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
        
     
)

【讨论】:

【参考方案4】:

最好的方法是使用print("your output", file=...)之类的东西。

完整代码如下:

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

【讨论】:

以上是关于如何在 Python 中将控制台打印到文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python < 3 中将 UTF-8 编码文本打印到控制台?

如何在C#中将2D数组打印到控制台

如何在Python中将符号如●打印到文件中

如何在python中将打印作业发送到打印机

在 Java 中将 SQL 查询从 PreparedStatement 打印到控制台

如何在 Visual Studio C++ 中将西里尔文(俄语)字符输出到控制台?