【发布时间】:2018-09-02 10:10:00
【问题描述】:
我正在使用 python 模块BeautifulTable 向控制台发出表格。它包装了一些标题和内容,我想设置单元格宽度,所以它不会这样做。
我尝试通过table.column_widths(根据文档)设置宽度,但这似乎没有任何效果。
【问题讨论】:
标签: python terminal python-beautifultable
我正在使用 python 模块BeautifulTable 向控制台发出表格。它包装了一些标题和内容,我想设置单元格宽度,所以它不会这样做。
我尝试通过table.column_widths(根据文档)设置宽度,但这似乎没有任何效果。
【问题讨论】:
标签: python terminal python-beautifultable
您可以使用table.columns.width 指定宽度,例如
table.columns.width = 30
或
table.columns.width = [20, 30, 40]
如果表中包含动态数据,最好在默认80的基础上增加maxwidth:
table = BeautifulTable(maxwidth=120)
您也可以在将数据放入列之前自行将数据包装成所需的宽度。 textwrap stdlib 模块可能对此有用。对于 JSON 数据,使用json.dumps() 进行漂亮打印可能会有所帮助,例如:
json.dumps(data, indent=2)
【讨论】:
如果您使用的是 BeautifulTable 1.0.0,您的语法如下:
table.columns.width = [12,5,8,10,6,33]
print(table)
而旧语法 table.column_widths = [12,5,8,10,6,33] 在调用 print(table) 时往往会被自动覆盖。
来自官方release notes:
BeautifulTable.columns.width 的更新行为(之前的 BeautifulTable.column_widths)。默认情况下,它不再覆盖用户指定的宽度。您可以通过将其设置为“自动”将其重置为默认值
【讨论】:
根据 v0.8.0 的 docs 和 change log,可以通过设置 column_widths 属性来控制列宽:
>>> table.column_widths = 5
>>> print(table.column_widths)
PositiveIntegerMetaData<5, 5, 5, 5, 5, 5, 5>
>>> table.column_widths = [10, 20, 5, 7, 10, 10, 5]
>>> print(table.column_widths)
PositiveIntegerMetaData<10, 20, 5, 7, 10, 10, 5>
请注意,最近的更改日志还说它放弃了对 Python v3.3 的支持 我只在 Python v3.7.5 中对此进行了测试,一旦再次打印表格,这些值就会被覆盖。
如果您使用的是 v3.3+ 并且您不想截断或包装您的标题/字段,那么我发现的唯一“解决方法”是将 max_table_width 设置为足够大的值容纳所有行内容 + 填充 + 边框:
>>> table.max_table_width = 150
当然,这有其明显的局限性。
【讨论】:
来自docs:
column_widths
获取/设置表格列的宽度。
列的宽度指定一列可以包含的最大字符数。较大的字符根据width_exceed_policy的值进行处理。
因此 column_widths 只处理一列中的最大字符数。为了处理溢出的文本 width_exceed_policy 必须使用。
table.width_exceed_policy = BeautifulTable.WEP_ELLIPSIS
从文档中它可以是以下之一:
BeautifulTable.WEP_WRAP :一个项目被包裹,所以每一行都适合它的列宽。BeautifulTable.WEP_STRIP :一个项目被剥离以适应它的列。BeautifulTable.WEP_ELLIPSIS :一个项目被剥离以适应它的列并附加…(省略号)。【讨论】: