用 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 | +----+---------+-----------+------------+----------+-----------+--------------+
感谢您的帮助。
I have a list of labels, and data as follows.
['id', 'Version', 'chip_name', 'xversion', 'device', 'opt_param', 'place_effort'] [1, 1.0, u'virtex2', u'xilinx11.5', u'xc5vlx50', u'Speed', u'High']
I need to print them into console. And for this, I'm iterating over the list, and print out each element with a tab ('\t').
But, unfortunately, the result is not so pretty.
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
The string length of label and data is quite variable, and it's not aligned well.
Is there any solution to this problem with Python?
ADDED
Hepled by Mike DeSimone's answer, I could make the pretty printer that I can use for my purposes. The valueResults are a list of duple.
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'
And this is the result.
+----+---------+-----------+------------+----------+-----------+--------------+ | 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 | +----+---------+-----------+------------+----------+-----------+--------------+
Thanks for the help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
在打印之前使用 ljust 填充内容。
输出:
Use ljust to stuff the contents before they are printed out.
output:
像这样的东西:
输出:
如果你想变得更奇特,请使其 reStructuredText-准备好:
输出:
Something like this:
Output:
If you want to get fancy, make it reStructuredText-ready:
Output:
你可以
从 http://docs.python.org/tutorial/inputoutput.html
:
之后的整数是填充。或者更好
you could try this
from http://docs.python.org/tutorial/inputoutput.html
The integer after the
:
is the padding.or better yet
您可以使用现成的解决方案:: prettytable 一个简单的 Python 库,用于在视觉上吸引人的 ASCII 表格中轻松显示表格数据format
其他解决方案,请参阅我的类似问题其他答案:如何将漂亮的打印模块扩展到表格?
You can use ready solution: : prettytable A simple Python library for easily displaying tabular data in a visually appealing ASCII table format
Other solutions, see my similar questions other answers: How to extend pretty print module to tables?
另一种解决方案是根本不使用制表符,并使用空格来调整列宽,也不需要手动填充,因为“%Ns”字符串格式很方便,例如
输出:
Another solution is not to use tab at all, and uses spaces to adjust column width, also no need of manually padding, as '%Ns' string formatting comes handy e.g.
Output:
为了快速解决方案,如果 ln 是包含所有这些列表的列表,
将打印由制表符分隔的列并左对齐。如果还不太漂亮,请增加 ljust 内的值。
For a quick solution, If ln is the list containing all these lists,
will print columns seperated by tab and left-justified. Increase the value inside ljust if it isn't pretty yet.