表格宽度可变

时间:2018-11-21 00:38:41

标签: python string-formatting

我正在尝试在文本表中显示来自CSV的数据。我已经到了可以显示我需要的所有内容的地步,但是仍然必须设置表的宽度,这意味着如果数据长于设置的数字,那么问题就会开始。

我目前使用.format打印表格以整理格式,是否有办法将数据的宽度设置为一个变量,该变量取决于最长的数据的长度?

for i in range(len(list_l)):
    if i == 0:
        print(h_dashes)
        print('{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}'.format('|', (list_l[i][0].upper()),'|', (list_l[i][1].upper()),'|',(list_l[i][2].upper()),'|', (list_l[i][3].upper()),'|'))
        print(h_dashes)
    else:
        print('{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}'.format('|', list_l[i][0], '|', list_l[i][1], '|', list_l[i][2],'|', list_l[i][3],'|'))

我意识到代码还很完美,但我仍然是一个新手,因此在各种教程中都是零碎的

1 个答案:

答案 0 :(得分:0)

您实际上可以使用两次通过方法来首先获得正确的长度。按照您的示例(每行四个字段),以下显示了您可以使用的基本概念。

下面是两次遍历方法的示例,首先获取每个字段的最大长度,另一个获取当前正在执行的操作(使用计算出的长度而不是固定的长度):

# Can set MINIMUM lengths here if desired, eg: lengths = [10, 0, 41, 7]

lengths = [0] * 4
fmtstr = None

for pass in range(2):
    for i in range(len(list_l)):
        if pass == 0:
            # First pass sets lengths as per data.

            for field in range(4):
                lengths[field] = max(lengths[field], len(list_l[i][field])
        else:
            # Second pass prints the data.

            # First, set format string if not yet set.

            if fmtstr is None:
                fmtstr = '|'
                for item in lengths:
                    fmtstr += '{:^%ds}|' % (item)

            # Now print item (and header stuff if first item).

            if i == 0: print(h_dashes)
            print(fmtstr.format(list_l[i][0].upper(), list_l[i][1].upper(), list_l[i][2].upper(), list_l[i][3].upper()))
            if i == 0: print(h_dashes)

第一次处理第二遍中的项目时,便完成了格式字符串的构造。

通过采用[31,41,59]之类的集合并为您提供字符串来做到这一点:

|{:^31s}|{:^41s}|{:^59s}|

{:^1s}实际上不是变化项时,使用所有这些|格式说明符没什么意义-您也可以将其直接编码为格式字符串。 / p>