Python 2.6.6 - 如何打印列对齐的表格形式的列表?
Python 2.6.6 - How do I print a list in tabular form with aligned columns?
用例很简单。我有一个不同长度的字符串列表,我想打印它们,以便它们以表格形式显示(见下文)。考虑在您的计算机上列出一个目录。它将它们显示为适合当前 window 大小的 table 并考虑列表中最长的值,以便所有列对齐。根据我的需要,我会在需要换行之前指定最大行长度。
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 上实现我在这里尝试做的事情?
我确信有更好的(更多 "pythonic")方法来执行此处执行的某些步骤。我做我知道的。如果有人想提出更好的方法,欢迎您提出意见。
以下是 运行 成功的示例:
>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
for item in subList:
formatStr = '{:%d}' % (itemMax)
printList.append(formatStr.format(item))
根据 ValueError: zero length field name in format in Python2.6.6,您不能在 2.6.6 中使用 "anonymous" 格式字符串。像 "{: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))
用例很简单。我有一个不同长度的字符串列表,我想打印它们,以便它们以表格形式显示(见下文)。考虑在您的计算机上列出一个目录。它将它们显示为适合当前 window 大小的 table 并考虑列表中最长的值,以便所有列对齐。根据我的需要,我会在需要换行之前指定最大行长度。
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 上实现我在这里尝试做的事情?
我确信有更好的(更多 "pythonic")方法来执行此处执行的某些步骤。我做我知道的。如果有人想提出更好的方法,欢迎您提出意见。
以下是 运行 成功的示例:
>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
for item in subList:
formatStr = '{:%d}' % (itemMax)
printList.append(formatStr.format(item))
根据 ValueError: zero length field name in format in Python2.6.6,您不能在 2.6.6 中使用 "anonymous" 格式字符串。像 "{: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))