Переменная ширина таблицы с .format - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь отобразить данные из 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 голосов
/ 21 ноября 2018

На самом деле вы можете использовать двухпроходный подход , чтобы сначала получить правильные длины.В соответствии с вашим примером с четырьмя полями в строке, ниже показана основная идея, которую вы можете использовать.

Ниже приведен пример двухпроходного подхода: сначала получить максимальную длину для каждого поля, а другой -чтобы сделать то, что вы делаете в данный момент (с расчетной, а не фиксированной длиной):

# 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}, когда | не на самом деле изменяющийся элемент - вы также можете закодировать его непосредственно в строку формата.

...