如何将 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)
我正在为 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)