将Python错误写入txt文件

问题描述 投票:0回答:5

我很难让它正常工作(显然) - 我快到了,而且我很清楚为什么它不起作用 - 只是不知道如何让它工作。

这假设尝试将文件读入内存,如果失败,则会转到代码块的“例外”子句(该部分是“duh”)。错误文件打印:“<main.DebugOutput 实例位于 0x04021EB8>”。我想要它做的是打印实际的错误。就像 FileIOError 或 TraceBackError 或该错误文件的任何内容一样。这只是开始阶段,我计划添加日期戳等内容并将其附加,而不是写入/创建 - 我只需要将实际错误打印到文件中。建议?

import os, sys

try:
    myPidFile = "Zeznadata.txt"
    myOpenPID_File = open(myPidFile, "r") #Attempts to open the file
    print "Sucessfully opened the file: \"" + myPidFile + "\"."

except:
    print "This file, \"" + myPidFile + "\", does not exist.  Please check the file name and try again.  "
    myFileErr = open("PIDErrorlog.txt", "w")
    myStdError = str(sys.stderr)
    myFileErr.write(myStdError)
    myFileErr.close()
    print "\nThis error was logged in the file (and stored in the directory): "
python error-handling
5个回答
7
投票

首先,您应该使用日志库。它将帮助您处理不同的日志记录级别(信息/警告/错误)、时间戳等。

http://docs.python.org/library/logging.html

其次,您需要捕获错误,然后可以记录有关它的详细信息。这个例子来自Python文档。

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())

except IOError as (errno, strerror):
    print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
    print "Could not convert data to an integer."
except:
    print "Unexpected error:", sys.exc_info()[0]
    raise

看看它如何捕获 IOError 并将错误号和错误消息分配给变量?您可以为要处理的每种错误类型设置一个

except
块。在最后一个(通用错误)块中,它使用
sys.exc_info()[0]
来获取错误详细信息。

http://docs.python.org/tutorial/errors.html


3
投票

问题就在这里:

 myStdError = str(sys.stderr)
 myFileErr.write(myStdError)

sys.stderr 是 POSIX 标准中定义的类似文件的接口,称为 标准错误,而不是可以写入文件的“错误文本”。所以你(可能)想做的是:

sys.stderr = myFileErr

这是相当于 Unix shell 中的

python your_python_sctipt.py 2> PIDErrorLog.txt
的 python。


1
投票

使用日志记录模块。日志记录模块具有异常格式化程序,可以帮助您以漂亮的方式打印异常。

http://docs.python.org/library/logging.html


0
投票

就像 Kimvais 所说,你的问题是:

myStdError = str(sys.stderr)
myFileErr.write(myStdError)

sys.stderr 是 stderr 的文件句柄(stdout 是 print 写入的内容)。

你应该这样做:

try:
    ...open file...
except IOError as (errno, strerror):
    ...open errfile...
    errfile.write(strerror)
    errfile.close()

Alison的回答也很好,写得很好。


0
投票

这会将控制台中的所有错误记录到 txt 文件中。每次运行脚本时,它都会清除以前的错误并从头开始。如果要保存以前的错误,请将“w”更改为“a”。放在代码的最开头:

import sys

with open('./errors.txt', 'w') as file5:  
    file5.write('')
    file5.close()

sys.stderr = open("./errors.txt", "a") 
© www.soinside.com 2019 - 2024. All rights reserved.