我正在寻找一种解决方案,可以打印数据库表格中未知列宽的内容。以下是解决方案:
def printTable(myDict, colList=None):
""" Pretty print a list of dictionaries (myDict) as a dynamically sized table.
If column names (colList) aren't specified, they will show in random order.
Author: Thierry Husson - Use it as you want but don't blame me.
"""
if not colList: colList = list(myDict[0].keys() if myDict else [])
myList = [colList]
for item in myDict: myList.append([str(item[col] if item[col] is not None else '') for col in colList])
colSize = [max(map(len,col)) for col in zip(*myList)]
formatStr = ' | '.join(["{{:<{}}}".format(i) for i in colSize])
myList.insert(1, ['-' * i for i in colSize])
for item in myList: print(formatStr.format(*item))
示例:
printTable([{'a':123,'bigtitle':456,'c':789},{'a':'x','bigtitle':'y','c':'z'}, \
{'a':'2016-11-02','bigtitle':1.2,'c':78912313213123}], ['a','bigtitle','c'])
输出:
a | bigtitle | c
123 | 456 | 789
x | y | z
2016-11-02 | 1.2 | 78912313213123
在 Psycopg 上下文中,您可以按照以下方式使用它:
curPG.execute("SELECT field1, field2, ... fieldx FROM mytable")
printTable(curPG.fetchall(), [c.name for c in curPG.description])
如果您需要多行行的变体,这里提供一个解决方案:
def printTable(myDict, colList=None, sep='\uFFFA'):
""" Pretty print a list of dictionaries (myDict) as a dynamically sized table.
If column names (colList) aren't specified, they will show in random order.
sep: row separator. Ex: sep='\n' on Linux. Default: dummy to not split line.
Author: Thierry Husson - Use it as you want but don't blame me.
"""
if not colList: colList = list(myDict[0].keys() if myDict else [])
myList = [colList]
for item in myDict: myList.append([str(item[col] or '') for col in colList])
colSize = [max(map(len,(sep.join(col)).split(sep))) for col in zip(*myList)]
formatStr = ' | '.join(["{{:<{}}}".format(i) for i in colSize])
line = formatStr.replace(' | ','-+-').format(*['-' * i for i in colSize])
item=myList.pop(0); lineDone=False
while myList or any(item):
if all(not i for i in item):
item=myList.pop(0)
if line and (sep!='\uFFFA' or not lineDone): print(line); lineDone=True
row = [i.split(sep,1) for i in item]
print(formatStr.format(*[i[0] for i in row]))
item = [i[1] if len(i)>1 else '' for i in row]
示例:
sampleDict = [{'multi lines title': 12, 'bigtitle': 456, 'third column': '7 8 9'},
{'multi lines title': 'w x y z', 'bigtitle': 'b1 b2', 'third column': 'z y x'},
{'multi lines title': '2', 'bigtitle': 1.2, 'third column': 78912313213123}]
printTable(sampleDict, sep=' ')
输出:
bigtitle | multi | third
| lines | column
| title |
456 | 12 | 7
| | 8
| | 9
b1 | w | z
b2 | x | y
| y | x
| z |
1.2 | 2 | 78912313213123
没有使用
sep
参数,
printTable(sampleDict)
会给你输出以下结果:
bigtitle | multi lines title | third column
---------+-------------------+---------------
456 | 12 | 7 8 9
b1 b2 | w x y z | z y x
1.2 | 2 | 78912313213123
for key in d: print('{}\t{}\t{}'.format(key, d[key][0], d[key][1]))
(在大括号内添加:<width>
就可以自由调整宽度了)... - Henry Keiter