有没有一种方法可以记录Python控制台上自动生成的消息?

3

我正在使用pandas加载一个包含一些错误行的csv文件。这意味着在一些行中有一些额外的逗号,因此pandas无法加载它。对我来说没关系。我使用error_bad_lines=False来忽略那些行。当pandas忽略这些错误行时,它会在控制台上显示如下消息:

b'Skipping line 3: expected 3 fields, saw 4\n

我希望能够加载数据并在日志文件中记录跳过的行数。我查看了很多关于日志记录的教程,但没有找到在pandas加载数据时自动跳过一行时记录此消息的方法。这是我用来加载文件的简单代码。
import pandas as pd
import os

def main():
    filename = "test_data3.csv"
    data= pd.read_csv(filename,error_bad_lines=False)
    print(data.head())


if __name__=="__main__":
    main()

以下是我使用的样本数据。
Col1,Col2,Col3
a,3,g4
b,4,s5,r
c,5,p9
f,6,v4,7
x,65,h5

正如您所看到的,第2行和第4行应该被跳过。但是它需要被记录在日志文件中。


如果pandas在使用Python logging来输出其消息,那么你可以配置默认的logger。如果没有使用logging,则需要将stdout或stderr(哪一个产生了错误)重定向到文件中。 - GaryO
谢谢@GaryO 我是Python新手,你能分享一些关于日志记录中stdout或stderr的链接吗? - vik2426
你是在Linux上运行它吗? - developer_hatch
@DamianLattenero 不,我在Windows上运行它。 - vik2426
最好的方法是查看pandas如何输出该错误信息。 (Pandas是开源的,您可以获取副本并搜索该错误字符串。)如果它使用python日志记录,则您很幸运。 如果没有,请在此处回复它如何打印错误。 如果您在pandas中的代码附近查找,您可能还会发现重定向或处理它的方法。 最坏的情况下,您始终可以“猴子补丁”该函数,但除非您没有其他选择,否则通常不建议这样做。 - GaryO
显示剩余3条评论
2个回答

4
你可以使用上下文管理器来暂时截取对 sys.stderr.write 的调用,并将消息写入文件:
import pandas as pd
import sys

class CaptureErrors:
    def __init__(self, stderr, output_name):
        self.stderr = stderr
        self.output_name = output_name
        self.output_file = None

    def __enter__(self):
        self.output_file = open(self.output_name, "w")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        if self.output_file:
            self.output_file.close()
        sys.stderr = self.stderr

    def write(self, message):
        self.stderr.write(message)
        self.output_file.write(message)

def main():
    filename = "test_data3.csv"
    with CaptureErrors(sys.stderr, 'error.txt') as sys.stderr:
        data = pd.read_csv(filename, error_bad_lines=False)
    print(data.head())

if __name__=="__main__":
    main()

如果这不是你所寻找的,可能需要在你的问题中添加更多信息。

1
你可以使用将输出重定向到文件doubg:
python script.py > out.txt

感谢您的留言。我可以在控制台中看到这条消息:b'Skipping line 3: expected 3 fields, saw 4\nSkipping line 5: expected 3 fields, saw 4\n'但是,我该如何将此消息保存在日志文件中呢? - vik2426
@vik2426 我编辑了问题,请告诉我是否适合您。 - developer_hatch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接