使用Python实现美化打印?
我有一份标签和数据的列表,如下所示。
['id', 'Version', 'chip_name', 'xversion', 'device', 'opt_param', 'place_effort'] [1, 1.0, u'virtex2', u'xilinx11.5', u'xc5vlx50', u'Speed', u'High']
我想把它们打印到控制台上。为此,我正在遍历这个列表,并用制表符('\t')打印每个元素。
但是,结果看起来并不好。
number of data 1 and number of column 7 id Version chip_name xversion device opt_param place_effort 1 1.0 virtex2 xilinx11.5 xc5vlx50 Speed High
标签和数据的字符串长度变化很大,所以它们没有对齐。
有没有什么方法可以用Python解决这个问题呢?
补充说明
在Mike DeSimone的回答的帮助下,我可以制作一个漂亮的打印工具,来满足我的需求。valueResults是一个包含元组的列表。
labels = queryResult.names
valueResults = queryResult.result
# get the maximum width
allData = valueResults
allData.insert(0,labels)
transpose = zip(*valueResults) # remove the sequence as a parameter
#print transpose
for value in transpose:
# value is integer/float/unicode/str, so make it length of str
newValue = [len(str(i)) for i in value]
columnWidth = max(newValue)
columnWidths.append(columnWidth)
dividers.append('-' * columnWidth)
dblDividers.append('=' * columnWidth)
label = value[0]
paddedLabels.append(label.center(columnWidth))
paddedString = ""
for values in valueResults[1:]:
paddedValue = []
for i, value in enumerate(values):
svalue = str(value)
columnWidth = columnWidths[i]
paddedValue.append(svalue.center(columnWidth))
paddedString += '| ' + ' | '.join(paddedValue) + ' |' + '\n'
string += '+-' + '-+-'.join(dividers) + '-+' + '\n'
string += '| ' + ' | '.join(paddedLabels) + ' |' + '\n'
string += '+=' + '=+='.join(dblDividers) + '=+' + '\n'
string += paddedString
string += '+-' + '-+-'.join(dividers) + '-+' + '\n'
这是结果。
+----+---------+-----------+------------+----------+-----------+--------------+ | id | Version | chip_name | xversion | device | opt_param | place_effort | +====+=========+===========+============+==========+===========+==============+ | 1 | 1.0 | virtex2 | xilinx11.5 | xc5vlx50 | Speed | High | | 2 | 1.0 | virtex2 | xilinx11.5 | xc5vlx50 | Speed | High | +----+---------+-----------+------------+----------+-----------+--------------+
谢谢大家的帮助。
6 个回答
3
你可以试试这个
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
... print '{0:10} ==> {1:10d}'.format(name, phone)
...
Jack ==> 4098
Dcab ==> 7678
Sjoerd ==> 4127
来自 http://docs.python.org/tutorial/inputoutput.html
在 :
后面的数字是用来填充的。
或者更好的是
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print ('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
... 'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
4
使用ljust可以在内容打印出来之前,把内容填充到指定的宽度。
import sys
def maxwidth(table, index):
"""Get the maximum width of the given column index"""
return max([len(str(row[index])) for row in table])
def pprint_table(table):
colpad = []
for i in range(len(table[0])):
colpad.append(maxwidth(table, i))
for row in table:
print str(row[0]).ljust(colpad[0] + 1),
for i in range(1, len(row)):
col = str(row[i]).rjust(colpad[i] + 2)
print "", col,
print ""
a = ['id', 'Version', 'chip_name', 'xversion', 'device', 'opt_param', 'place_effort']
b = [1, 1.0, u'virtex2', u'xilinx11.5', u'xc5vlx50', u'Speed', u'High']
# Put it in the table
c = [a, b]
pprint_table(c)
输出结果:
id Version chip_name xversion device opt_param place_effort
1 1.0 virtex2 xilinx11.5 xc5vlx50 Speed High
3
像这样:
labels = ['id', 'Version', 'chip_name', 'xversion', 'device', 'opt_param',
'place_effort']
values = [1, 1.0, u'virtex2', u'xilinx11.5', u'xc5vlx50', u'Speed', u'High']
paddedLabels = []
paddedValues = []
for label, value in zip(labels, values):
value = str(value)
columnWidth = max(len(label), len(value))
paddedLabels.append(label.center(columnWidth))
paddedValues.append(value.center(columnWidth))
print ' '.join(paddedLabels)
print ' '.join(paddedValues)
输出结果:
id Version chip_name xversion device opt_param place_effort
1 1.0 virtex2 xilinx11.5 xc5vlx50 Speed High
如果你想让它更高级一点,可以让它支持 reStructuredText 格式:
labels = ['id', 'Version', 'chip_name', 'xversion', 'device', 'opt_param',
'place_effort']
values = [1, 1.0, u'virtex2', u'xilinx11.5', u'xc5vlx50', u'Speed', u'High']
paddedLabels = []
paddedValues = []
dividers = []
dblDividers = []
for label, value in zip(labels, values):
value = str(value)
columnWidth = max(len(label), len(value))
paddedLabels.append(label.center(columnWidth))
paddedValues.append(value.center(columnWidth))
dividers.append('-' * columnWidth)
dblDividers.append('=' * columnWidth)
print '+-' + '-+-'.join(dividers) + '-+'
print '| ' + ' | '.join(paddedLabels) + ' |'
print '+=' + '=+='.join(dblDividers) + '=+'
print '| ' + ' | '.join(paddedValues) + ' |'
print '+-' + '-+-'.join(dividers) + '-+'
输出结果:
+----+---------+-----------+------------+----------+-----------+--------------+
| id | Version | chip_name | xversion | device | opt_param | place_effort |
+====+=========+===========+============+==========+===========+==============+
| 1 | 1.0 | virtex2 | xilinx11.5 | xc5vlx50 | Speed | High |
+----+---------+-----------+------------+----------+-----------+--------------+