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

标签 python python-3.x

我正在使用 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 行。但需要记录在日志文件中。

最佳答案

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

如果这不是您要查找的内容,您可能需要向您的问题添加更多信息。

关于python - 有没有办法在 Python 控制台上记录自动生成的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57120540/

相关文章:

python - 在 PyGobject 中绘图 (python3)

python - 如何将字典列表合并到一个字典

python - 从同一 pandas 数据帧的切片中减去切片

python - 使用 python 比较两个目录中的文件以查找一个目录中的文件而不是另一个目录中的文件 - 与子目录结构无关

mysql - PyMySQL.connect() 忽略密码

Python3,在另一个类中使用对象实例

python - 将新的 PyObject * 从 C++ 返回到 Python 最终会出现段错误

python - 如何重新抛出包含有关原始异常信息的异常?

python - 如何防止在使用 python 的 Linux 中使用 "ctrl+c"终止正在运行的程序?

Python:使用request从网页获取自动建议的结果