社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

vik2426 • 6 年前 • 1308 次点击  

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/37111
文章 [ 2 ]  |  最新文章 6 年前
Damian Lattenero
Reply   •   1 楼
Damian Lattenero    6 年前

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

python script.py > out.txt
David Cullen
Reply   •   2 楼
David Cullen    6 年前

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

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