Python - 打印对齐列

时间:2016-10-29 17:30:01

标签: python list csv format stdout

我编写了一段与Python 2Python 3完全兼容的代码片段。我编写的片段解析数据,并将输出构建为CSV字符串列表

该脚本提供选项

  • 将数据写入CSV file
  • 将其显示在stdout

虽然在显示到,(第二个项目符号选项)时,我可以轻松地遍历列表并将\t替换为stdout,但项目具有任意长度,因此请勿行由于标签的差异,格式很好。

我做了很多研究,我相信字符串格式选项可以完成我所追求的目标。也就是说,我似乎无法找到一个帮助我正确理解语法的例子。

我希望不使用外部库。我知道如果我走这条路线有很多选择,但我希望脚本尽可能兼容和简单。

以下是一个例子:

value1,somevalue2,value3,reallylongvalue4,value5,superlongvalue6
value1,value2,reallylongvalue3,value4,value5,somevalue6
你能帮帮我吗?任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:6)

import csv
from StringIO import StringIO

rows = list(csv.reader(StringIO(
    '''value1,somevalue2,value3,reallylongvalue4,value5,superlongvalue6
value1,value2,reallylongvalue3,value4,value5,somevalue6''')))

widths = [max(len(row[i]) for row in rows) for i in range(len(rows[0]))]

for row in rows:
    print(' | '.join(cell.ljust(width) for cell, width in zip(row, widths)))

输出:

value1 | somevalue2 | value3           | reallylongvalue4 | value5 | superlongvalue6
value1 | value2     | reallylongvalue3 | value4           | value5 | somevalue6     

答案 1 :(得分:0)

def printCsvStringListAsTable(csvStrings):

    # convert to list of lists
    csvStrings = map(lambda x: x.split(','), csvStrings)

    # get max column widths for printing
    widths = []
    for idx in range(len(csvStrings[0])):
        columns = map(lambda x: x[idx], csvStrings)
        widths.append(
            len(
                max(columns, key = len)
            )
        )

    # print the csv strings
    for row in csvStrings:
        cells = []
        for idx, col in enumerate(row):
            format = '%-' + str(widths[idx]) + "s"
            cells.append(format % (col))
        print ' |'.join(cells)


if __name__ == '__main__':
    printCsvStringListAsTable([
        'col1,col2,col3,col4',
        'val1,val2,val3,val4',
        'abadfafdm,afdafag,aadfag,aadfaf',
    ])

输出:

col1      |col2    |col3   |col4
val1      |val2    |val3   |val4
abadfafdm |afdafag |aadfag |aadfaf

Alex Hall的回答肯定更好,也是我写过的相同代码的简洁形式。