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