6 import cStringIO,operator
7 from functools
import reduce
8 def indent(rows,hasHeader=False,headerChar='-',delim=' | ',justify='center',
9 separateRows=
False,prefix=
'',postfix=
'',wrapfunc=
lambda x:x):
11 Indents a table by column.
12 - rows: A sequence of sequences of items, one sequence per row.
13 - hadHeader: True if the first row consists of the column's names.
14 - headerChar: Character to be used for the row separator line
15 (if hasHeader==True or separateRows==True).
16 - delim: The column delimiter.
17 - justify: Determines how are data justified in their column.
18 Valid values are 'left','right','center'.
19 - separateRows: True if rows are to be separated by a line of 'headerChar's.
20 - prefix: A string prepended to each printed row.
21 - postfix: A string appended to each printed row.
22 - wrapfunc: A function f(text) for wrapping text; each element in the table is first wrapped by this function.
27 newRows=[wrapfunc(item).
split(
'\n')
for item
in row]
31 return [[substr
or '' for substr
in item]
for item
in map(
None,*newRows)]
33 logicalRows = [rowWrapper(row)
for row
in rows]
35 columns = map(
None,*reduce(operator.add,logicalRows))
37 maxWidths = [
max([len(str(item))
for item
in column])
for column
in columns]
38 rowSeparator = headerChar * (len(prefix) + len(postfix) + sum(maxWidths) + len(delim)*(len(maxWidths)-1))
40 justify = {
'center':str.center,
'right':str.rjust,
'left':str.ljust}[justify.lower()]
41 output=cStringIO.StringIO()
42 if separateRows:
print >> output,rowSeparator
43 for physicalRows
in logicalRows:
44 for row
in physicalRows:
45 print >> output, prefix+delim.join([justify(str(item),width)
for (item,width)
in zip(row,maxWidths)])+postfix
46 if separateRows
or hasHeader:
print >> output, rowSeparator; hasHeader=
False
47 return output.getvalue()
49 if __name__ ==
'__main__':
50 from wordWrappers
import wrap_always,wrap_onspace,wrap_onspace_strict
51 labels=(
'First Name',
'Last Name',
'Age',
'Position')
52 data=
"""John,Smith,24,Software Engineer
53 Mary,Brohowski,23,Sales Manager
54 Aristidis,Papageorgopoulos,28,Senior Reseacher"""
55 rows=[row.strip().
split(
',')
for row
in data.splitlines()]
57 print 'without wrapping function\n'
58 print 'raw input: ',[labels]+rows
59 print indent([labels]+rows,hasHeader=
True)
61 for wrapper
in (wrap_always,wrap_onspace,wrap_onspace_strict):
62 print 'Wrapping function: %s(x,width=%d)\n'%(wrapper.__name__,width)
63 print indent([labels]+rows,hasHeader=
True,separateRows=
True,prefix=
'| ',postfix=
' |',wrapfunc=
lambda x:
wrapper(x,width))
66 (
'%-*s'%(8,
'run'),
'%-*s'%(8,
'first'),
'%-*s'%(8,
'last'),
'%-*s'%(10,
'delivered'),
'%-*s'%(10,
'recorded'),
'%-*s'%(20,
'recorded\nmypathdfdafddafd')),\
67 [
'%d'%(132440),
'%d'%(23),
'%d'%(99),
'%.2f'%(2.345),
'%.2f'%(1.23),
'%.2f'%(0.5678)],\
68 [
'%d'%(132442),
'%d'%(1),
'%d'%(20),
'%.2f'%(2.345),
'%.2f'%(1.23),
'%.2f'%(0.5678)],\
69 [
'',
'%d'%(27),
'%d'%(43),
'%.2f'%(2.345),
'%.2f'%(1.23),
'%.2f'%(0.5678)]\
71 lumiheader=[(
'%-*s'%(30,
'Lumi Sections'),
'%-*s'%(46,
'Luminosity'))]
73 print indent(lumiheader,hasHeader=
True,separateRows=
False,prefix=
'| ',postfix=
'',wrapfunc=
lambda x:
wrap_always(x,headerwidth))
74 lumifooter=[(
'%-*s'%(24,
'189'),
'%-*s'%(10,
'17.89'),
'%-*s'%(10,
'16.1'),
'%-*s'%(20,
'3.47'))]
76 print indent(lumidata,hasHeader=
True,separateRows=
False,prefix=
'| ',postfix=
'',wrapfunc=
lambda x:
wrap_onspace_strict(x,width))
78 print indent(lumifooter,hasHeader=
False,separateRows=
True,prefix=
' total: ',postfix=
'',delim=
' | ',wrapfunc=
lambda x:
wrap_always(x,25))
static HepMC::HEPEVT_Wrapper wrapper