Python 2.6.6 - Как напечатать список в табличной форме с выровненными столбцами? - PullRequest
0 голосов
/ 11 сентября 2018

Вариант использования прост. У меня есть список строк различной длины, и я хотел бы распечатать их, чтобы они отображались в виде таблицы (см. Ниже). Подумайте о создании каталога на вашем компьютере. Он отображает их в виде таблицы, которая соответствует текущему размеру окна и учитывает самое длинное значение в списке, чтобы все столбцы были выровнены. Для моих нужд я бы указывал максимальную длину строки, прежде чем ее нужно будет обернуть.

config                 constants.py           fuzzer
fuzzer_session         generator.py           README.docx
run_fuzzer_session.py  run_generator.py       tools
util                   VM_Notes.docx          wire_format_discoverer
xml_processor

Я придумал способ сделать это, но, видимо, он работает только с более новой версией python. Система, в которой он работает, использует python 3.6.4. Мне нужно сделать это в системе, которая использует версию 2.6.6. Когда я попробовал свой код в этой системе, я получил следующую ошибку:

$ python test.py . 80
Traceback (most recent call last):
  File "test.py", line 46, in <module>
    main()
  File "test.py", line 43, in main
    printTable(dirList, maxLen)
  File "test.py", line 27, in printTable
    printList.append(formatStr.format(item))
ValueError: zero length field name in format

Я полагаю, что метод, который я использую для создания спецификатора формата, это то, на что он жалуется.

Вот логика:

Примечание : я создаю свой список в этом примере, просто получая список каталогов. Мой реальный вариант использования не использует список каталогов.

import os
import sys

def printTable(aList, maxWidth):
    if len(aList) == 0:
        return

    itemMax = 0
    for item in aList:
        if len(item) > itemMax:
            itemMax = len(item)

    if maxWidth > itemMax: 
        numCol = int(maxWidth / itemMax)
    else:
        numCol = 1

    index = 0
    while index < len(aList):
        end = index + numCol
        subList = aList[index:end]
        printList = []

        for item in subList:
            formatStr = '{:%d}' % (itemMax)
            printList.append(formatStr.format(item))

        row = ' '.join(printList)
        print(row)
        index += numCol

def main():
    if len(sys.argv) < 3:
        print("Usage: %s <directory> <max length>" % (sys.argv[0]))
        sys.exit(1)

    aDir = sys.argv[1]
    maxLen = int(sys.argv[2])

    dirList = os.listdir(aDir)
    printTable(dirList, maxLen)

if __name__ == "__main__":
    main()

Есть ли способ добиться того, что я пытаюсь сделать здесь, на Python 2.6.6?

Я уверен, что есть лучшие (более "питонические") способы сделать некоторые из шагов, выполненных здесь. Я делаю то, что знаю. Если кто-то хочет предложить лучшие способы, ваши комментарии приветствуются.

Вот примеры успешного запуска:

>python test.py .. 80
config                 constants.py           fuzzer
fuzzer_session         generator.py           README.docx
run_fuzzer_session.py  run_generator.py       tools
util                   VM_Notes.docx          wire_format_discoverer
xml_processor

>python test.py .. 60
config                 constants.py
fuzzer                 fuzzer_session
generator.py           README.docx
run_fuzzer_session.py  run_generator.py
tools                  util
VM_Notes.docx          wire_format_discoverer
xml_processor

>python test.py .. 120
config                 constants.py           fuzzer                 fuzzer_session         generator.py
README.docx            run_fuzzer_session.py  run_generator.py       tools                  util
VM_Notes.docx          wire_format_discoverer xml_processor

1 Ответ

0 голосов
/ 11 сентября 2018
    for item in subList:
        formatStr = '{:%d}' % (itemMax)
        printList.append(formatStr.format(item))

Согласно ValueError: имя поля нулевой длины в формате в Python2.6.6 , у вас не может быть строки анонимного формата в 2.6.6. Синтаксис вроде "{:10}" не стал легальным до 2.7. До этого вам нужно было указать явный индекс, например "{0:10}"

    for item in subList:
        formatStr = '{0:%d}' % (itemMax)
        printList.append(formatStr.format(item))

... Но я чувствую, что вы могли бы избавить себя от некоторых проблем, пропустив все это и используя вместо этого ljust.

    for item in subList:
        printList.append(str(item).ljust(itemMax))
...