Python - 打印对齐列中的 CSV 字符串列表
Python - Print list of CSV strings in aligned columns
我写了一段代码,完全兼容 Python 2
和 Python 3
。我编写的片段 解析数据 并将 输出构建为 CSV 字符串列表 。
该脚本提供了一个选项来:
- 将数据写入
CSV file
,或
- 显示给
stdout
。
虽然我可以轻松地遍历列表并在显示为 stdout
(第二个项目符号选项)时将 ,
替换为 \t
,但项目的长度是任意的,所以不要由于选项卡的差异,无法以良好的格式排列。
我做了很多研究,我相信字符串格式选项可以实现我所追求的目标。也就是说,我似乎找不到可以帮助我正确使用语法的示例。
我宁愿不使用外部库。我知道如果我走那条路会有很多选择,但我希望脚本尽可能兼容和简单。
这是一个例子:
value1,somevalue2,value3,reallylongvalue4,value5,superlongvalue6
value1,value2,reallylongvalue3,value4,value5,somevalue6
你能帮帮我吗?任何建议将不胜感激。
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
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 的答案肯定更好,而且是我编写的相同代码的简洁形式。
我写了一段代码,完全兼容 Python 2
和 Python 3
。我编写的片段 解析数据 并将 输出构建为 CSV 字符串列表 。
该脚本提供了一个选项来:
- 将数据写入
CSV file
,或 - 显示给
stdout
。
虽然我可以轻松地遍历列表并在显示为 stdout
(第二个项目符号选项)时将 ,
替换为 \t
,但项目的长度是任意的,所以不要由于选项卡的差异,无法以良好的格式排列。
我做了很多研究,我相信字符串格式选项可以实现我所追求的目标。也就是说,我似乎找不到可以帮助我正确使用语法的示例。
我宁愿不使用外部库。我知道如果我走那条路会有很多选择,但我希望脚本尽可能兼容和简单。
这是一个例子:
value1,somevalue2,value3,reallylongvalue4,value5,superlongvalue6
value1,value2,reallylongvalue3,value4,value5,somevalue6
你能帮帮我吗?任何建议将不胜感激。
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
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 的答案肯定更好,而且是我编写的相同代码的简洁形式。