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。
我需要使用 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。