python 3.6+ 记录器记录 pandas 数据框 - 如何缩进整个数据框?

python 3.6+ logger to log pandas dataframe - how to indent the entire dataframe?

我需要使用 python 日志记录模块来记录 pandas 数据帧。我需要将整个数据框(所有行)均等缩进。

下面是简单的期望输出:

Test Dataframe Output Below:

       col1  col2
    0     1     3
    1     2     4

但是,我得到以下输出,其中缩进仅应用于数据帧的第一行:

Test Dataframe Output Below:

       col1  col2
0     1     3
1     2     4

示例代码我是 运行 是:

import pandas as pd
import logging

# sample dataframe
test_df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})

# logging set up
logging.basicConfig(level=logging.INFO)
logging.getLogger().handlers.clear()
c_handler = logging.StreamHandler()
c_handler.setFormatter(logging.Formatter('%(message)s'))
logging.getLogger().addHandler(c_handler)

# log the pandas dataframe to console
logging.info(f'\tTest Dataframe Output Below:')
logging.info(f'\n\t\t{test_df}')
logging.info(f'{test_df}')

任何帮助将不胜感激!

logging.info('\t'+ test_df.to_string().replace('\n', '\n\t')) 

假设您有这样的设置(基本上是从 https://www.toptal.com/python/in-depth-python-logging 复制的):

# my_logger.py
import logging
import sys
from logging.handlers import TimedRotatingFileHandler

def get_console_handler(formatter=False):
    console_handler = logging.StreamHandler(sys.stdout)
    if formatter:
        formatter = logging.Formatter("%(asctime)s — %(name)s — %(levelname)s — %(message)s")
        console_handler.setFormatter(formatter)
    return console_handler
def get_file_handler(log_file, formatter=False):
    file_handler = TimedRotatingFileHandler(log_file, when='midnight')
    if formatter:
        formatter = logging.Formatter("%(asctime)s — %(name)s — %(levelname)s — %(message)s")
        file_handler.setFormatter(formatter)
    return file_handler
def get_logger(logger_name, log_file, use_formatter=False):
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.DEBUG) # better to have too much log than not enough
    logger.addHandler(get_console_handler(use_formatter))
    logger.addHandler(get_file_handler(log_file, use_formatter))
    # with this pattern, it's rarely necessary to propagate the error up to parent
    logger.propagate = False
    return logger

...您可以将其导入其他文件:

from my_logger import get_logger
logger = get_logger(__name__, 'logs/debug.log', use_formatter=True)
df_logger = get_logger(str(__name__)+'_dfs', 'logs/debug.log', use_formatter=False)

现在,当你想记录一个数据框时,你可以使用以下方法。由于 df_logger 不使用格式化程序,数据帧表示将以正确的格式写入 log_file。

df_logger.debug(df)

...以及您可以使用的所有其他内容:

logger.debug(some_message)

也许您甚至可以将两个记录器实例合并到一个新的 class。