有没有办法在Python控制台上记录自动生成的消息?

2024-04-26 03:00:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用pandas加载一个csv文件,它几乎没有坏行。这意味着在少数行中有一些额外的逗号,这就是熊猫无法加载它的原因。这对我来说很好。我用error_bad_lines=False来忽略这些行。当pandas忽略这些坏行时,它会在控制台上显示如下消息:

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

我想要的是能够加载数据,但在日志文件中记录这个跳过的行号。我阅读了很多关于日志记录的教程,但是当熊猫在加载数据时跳过行号时,找不到一种方法来记录这个自动生成的消息。你知道吗

这是我用来加载文件的简单代码。你知道吗

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行。但需要记录在日志文件中。你知道吗


Tags: 文件csv数据importfalse消息pandasmain
2条回答

您可以使用上下文管理器临时拦截对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()

如果这不是你想要的,你可能需要在你的问题中添加更多的信息。你知道吗

可以使用重定向将输出重定向到文件doubg:

python script.py > out.txt

相关问题 更多 >