Python tabulate - настроить форматирование ячеек, содержащих списки
Я использую python-tabulate для печати данных с ячейками, содержащими списки. Могу ли я настроить, как python-tabulate форматирует содержимое ячейки, чтобы списки форматировались по-другому?
Я хотел бы избежать ручной предварительной обработки (преобразования списков в строку) данных, передаваемых в таблицу.
Если табуляция не позволяет этого, есть ли альтернативные библиотеки, где я могу определить более детальные параметры форматирования?
Образец кода:
from tabulate import tabulate
# Minimal sample. My output comes from an API and contains much more data
table = [['Sun', [1, 2, 3]], ['Moon', [4, 5, 6]]]
print(tabulate(table, tablefmt='plain', headers=['Planet', 'Value']))
Выход:
Planet Value
Sun [1, 2, 3]
Moon [4, 5, 6]
Как бы я хотел, чтобы вывод был отформатирован:
Planet Value
Sun 1,2,3
Moon 4,5,6
2 ответа
Я бы предложил вам попробовать другую библиотеку. Я проверил DOC и не нашел ничего связанного.
Или есть функция для этого (вы не просили об этом, хотя)
from tabulate import tabulate
def delist(lst):
return ",".join([str(item) for item in lst])
table = [['Sun', delist([1, 2, 3])], ['Moon', delist([4, 5, 6])]]
print(tabulate(table, tablefmt='plain', headers=['Planet', 'Value']))
>>>
Planet Value
Sun 1,2,3
Moon 4,5,6
Последний вариант, может быть, немного безнадежный... это взять табличный класс и интегрировать в него эту функцию. Но это немного излишне
Так как я не мог найти способ, как настроить табулирование соответствующим образом, одним из решений было бы использование встроенного метода _format патчей обезьяны.
Исходный метод (таблица 0.8.2):
def _format(val, valtype, floatfmt, missingval="", has_invisible=True):
"""Format a value accoding to its type.
Unicode is supported:
>>> hrow = ['\u0431\u0443\u043a\u0432\u0430', '\u0446\u0438\u0444\u0440\u0430'] ; \
tbl = [['\u0430\u0437', 2], ['\u0431\u0443\u043a\u0438', 4]] ; \
good_result = '\\u0431\\u0443\\u043a\\u0432\\u0430 \\u0446\\u0438\\u0444\\u0440\\u0430\\n------- -------\\n\\u0430\\u0437 2\\n\\u0431\\u0443\\u043a\\u0438 4' ; \
tabulate(tbl, headers=hrow) == good_result
True
"""
if val is None:
return missingval
if valtype in [int, _text_type]:
return "{0}".format(val)
elif valtype is _binary_type:
try:
return _text_type(val, "ascii")
except TypeError:
return _text_type(val)
elif valtype is float:
is_a_colored_number = has_invisible and isinstance(val, (_text_type, _binary_type))
if is_a_colored_number:
raw_val = _strip_invisible(val)
formatted_val = format(float(raw_val), floatfmt)
return val.replace(raw_val, formatted_val)
else:
return format(float(val), floatfmt)
else:
return "{0}".format(val)
Моя модифицированная версия:
# tabulate_extensions.py
from tabulate import _text_type, _binary_type, _strip_invisible
def _format_extended(val, valtype, floatfmt, missingval="", has_invisible=True):
"""Format a value accoding to its type.
Unicode is supported:
>>> hrow = ['\u0431\u0443\u043a\u0432\u0430', '\u0446\u0438\u0444\u0440\u0430'] ; \
tbl = [['\u0430\u0437', 2], ['\u0431\u0443\u043a\u0438', 4]] ; \
good_result = '\\u0431\\u0443\\u043a\\u0432\\u0430 \\u0446\\u0438\\u0444\\u0440\\u0430\\n------- -------\\n\\u0430\\u0437 2\\n\\u0431\\u0443\\u043a\\u0438 4' ; \
tabulate(tbl, headers=hrow) == good_result
True
"""
if val is None:
return missingval
if valtype in [int, _text_type]:
# Change list formatting [1,2,3] -> 1,2,3
if type(val) == list:
val = ','.join([str(x) for x in val])
return "{0}".format(val)
elif valtype is _binary_type:
try:
return _text_type(val, "ascii")
except TypeError:
return _text_type(val)
elif valtype is float:
is_a_colored_number = has_invisible and isinstance(val, (_text_type, _binary_type))
if is_a_colored_number:
raw_val = _strip_invisible(val)
formatted_val = format(float(raw_val), floatfmt)
return val.replace(raw_val, formatted_val)
else:
return format(float(val), floatfmt)
else:
return "{0}".format(val)
В моем коде я заменяю метод внутренних таблиц на мой, например:
from mypkg.tabulate_extensions import _format_extended
tabulate._format = _format_extended
Вывод теперь по желанию. Хорошо, что теперь я могу расширить форматирование других типов ячеек (например, словарей) любым удобным для меня способом.