Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python表格-配置如何格式化包含列表的单元格_Python_Tabulate - Fatal编程技术网

Python表格-配置如何格式化包含列表的单元格

Python表格-配置如何格式化包含列表的单元格,python,tabulate,Python,Tabulate,我使用python制表来打印包含列表的单元格的数据。 我可以自定义python如何制表单元格内容,以便列表以不同的方式格式化吗 我希望避免手动预处理(将列表转换为字符串)传递到表格的数据 如果tablate不允许这样做,是否有其他库可以定义更细粒度的格式选项 示例代码: from tabulate import tabulate # Minimal sample. My output comes from an API and contains much more data table = [

我使用python制表来打印包含列表的单元格的数据。 我可以自定义python如何制表单元格内容,以便列表以不同的方式格式化吗

我希望避免手动预处理(将列表转换为字符串)传递到表格的数据

如果tablate不允许这样做,是否有其他库可以定义更细粒度的格式选项

示例代码:

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

我建议你尝试不同的图书馆。我查了一下医生,没有发现任何相关信息

或者有它的功能(虽然你没有要求)


最后一个选择,也许有点绝望。。。就是把tablate类集成到这个函数中。但这有点过分了

,因为我找不到相应配置制表的方法,一个解决方案是使用monkey patch制表内部格式方法

原始方法(表0.8.2):

我的修改版本:

# 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
现在输出符合要求。 好消息是,我现在可以以任何方式扩展其他单元格类型(如字典)的格式

# 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