<pre><code>import textwrap
import itertools
def formatter(format_str,widths,*columns):
'''
format_str describes the format of the report.
{row[i]} is replaced by data from the ith element of columns.
widths is expected to be a list of integers.
{width[i]} is replaced by the ith element of the list widths.
All the power of Python's string format spec is available for you to use
in format_str. You can use it to define fill characters, alignment, width, type, etc.
formatter takes an arbitrary number of arguments.
Every argument after format_str and widths should be a list of strings.
Each list contains the data for one column of the report.
formatter returns the report as one big string.
'''
result=[]
for row in zip(*columns):
lines=[textwrap.wrap(elt, width=num) for elt,num in zip(row,widths)]
for line in itertools.izip_longest(*lines,fillvalue=''):
result.append(format_str.format(width=widths,row=line))
return '\n'.join(result)
</code></pre>
<p>例如:</p>
<pre><code>widths=[17,41]
form='{row[0]:<{width[0]}} {row[1]:<{width[1]}}'
titles=['Foobar-Title','0123','hi there','something']
blobs=['Blob','This is some long text which would wrap past the 80 column mark and go onto the next line number of times blah blah blah.','dito','more text here. more text here. more text here.']
print(formatter(form,widths,titles,blobs))
</code></pre>
<p>收益率</p>
<pre><code># Foobar-Title Blob
# 0123 This is some long text which would wrap
# past the 80 column mark and go onto the
# next line number of times blah blah blah.
# hi there dito
# something more text here. more text here. more text
# here.
</code></pre>
<p><code>formatter</code>可以接受任意数量的列。</p>