Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Python中的console打印到文件_Python_Logging_Console_Spyder - Fatal编程技术网

如何将Python中的console打印到文件

如何将Python中的console打印到文件,python,logging,console,spyder,Python,Logging,Console,Spyder,我正在使用Spyder for Pyton,对于某些问题,IPython控制台中的输出非常大(超过10000行),直接在IPython控制台中分析输出效率非常低。这就是为什么我想知道是否有一种方法可以将输出打印到.txt文件中?我尝试了这里的建议。因此,我在代码的开头使用: import sys sys.stdout = open('C:/Users/Python_Code/log.txt', 'w') 最后是sys.stdout.close()。但是,我收到一条错误消息,说明“Value e

我正在使用Spyder for Pyton,对于某些问题,IPython控制台中的输出非常大(超过10000行),直接在IPython控制台中分析输出效率非常低。这就是为什么我想知道是否有一种方法可以将输出打印到.txt文件中?我尝试了这里的建议。因此,我在代码的开头使用:

import sys
sys.stdout = open('C:/Users/Python_Code/log.txt', 'w')
最后是sys.stdout.close()。但是,我收到一条错误消息,说明“Value error:I/O operation on closed file”,并且没有创建log.txt文件。如果我在相应的文件夹中手动创建log.txt文件,该文件将保持为空。不仅保持文件为空,而且Spyder在执行此代码后根本没有反应,因此我必须关闭它并重新启动


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

请在关闭文件后放置
sys.stdout=sys.\uu stdout\uuu


某些内容仍在试图写入控制台,因此您必须将其更改为系统标准输出,以防止关闭后出错。如果您一定要捕获这些日志,那么必须在命令行上使用
python file.py>output.txt

我看不到深入到python中才能得到明确的答案,但我认为有一些保护措施可以防止您关闭与任何
stdout、stderr、stdin
关联的底层流。因此,解决方案是将sys.stdout临时保存到某个变量,并在关闭前重新分配它。以下是一个例子:

[1]中的
:导入系统
在[2]中:f=open('log.txt','w')
在[3]中:temp=sys.stdout
在[4]中:sys.stdout=f
在[5]中:打印(“Hi”)
在[6]中:sys.stdout=temp
在[7]中:f.close()
在[8]:!cat log.txt
你好
或者以一种更优雅的方式(我认为这是蟒蛇式的方式):

[9]中的
from contextlib import redirect\u stdout
在[10]中:以open('log.txt','w')作为f:
…:使用重定向标准输出(f):
…:打印(“再次你好!”)
...:
在[11]中:!cat log.txt
你好!

如果您的代码使用了
日志记录
模块,您可以选择写入文件

例如:

import logging.config
logging.config.dictConfig({
“版本”:1,
“禁用现有日志记录器”:True,
“格式化程序”:
“标准”:
“格式”:“%(asctime)s[%(levelname)s](name)s:%(message)s”
},
},
“处理程序”:
'默认值':{
“级别”:“信息”,
“格式化程序”:“标准”,
'class':'logging.FileHandler',
“文件名”:“error.log”,
“模式”:“a”,
},
},
‘伐木工人’:{
'':{#根记录器
'handlers':['default'],
“级别”:“警告”,
“传播”:False
},
'some.package':{
'handlers':['default'],
“级别”:“信息”,
“传播”:False
}
} 
})

最好的方法是使用类似于
打印(“您的输出”,file=…)

完整代码如下所示:

打开(“output_text.txt”,“w”)作为f:
打印(“您的输出文本…”,file=f)

查看python your_script.py>your_file.txt如何?查看在关闭文件后放置
sys.stdout=sys.\uuuuuuu stdout\uuu
是否有任何不同。在您关闭控制台后,它听起来好像仍在试图写入控制台,如果它不重要或您无法控制它,则可以将其重定向到正常控制台以避免错误。谢谢thshea的回答。基本上它是有效的。但是,现在控制台上没有打印任何内容。除了文件外,还有没有办法将特殊输出(并非全部)也打印到控制台?对我的上一条评论有何评论?我非常感谢您的进一步评论。请按照下面的答案进行查看。它有多个日志记录层,您可以过滤(调试、错误等),您可以手动过滤。而且它还具有写入控制台和文件的功能。请注意,如果您需要最小程度的自定义,您可以使用比其他注释少得多的代码来完成此操作:
logging.basicConfig(filename='example.log',encoding='utf-8',level=logging.DEBUG)
。感谢您的回答。我投了赞成票,接受了你的回答。我真的很感谢你的帮助。