Python PrettyTable 在同一行打印表格
我正在使用PrettyTable的'from_db_cursor'模块来漂亮地打印我从SQL请求中得到的响应。一切都运行得很好,我唯一的问题是,对于某些查询,我希望把它们对应的表格打印在同一行,像这样:
countUnivers1: countUnivers2: countUnivers3:
+----------+ +----------+ +----------+
| COUNT(*) | | COUNT(*) | | COUNT(*) |
+----------+ +----------+ +----------+
| 1681943 | | 51954 | | 4140984 |
+----------+ +----------+ +----------+
但是我找不到怎么做到这一点,这里是我目前使用的代码:
i = 0
tables = []
with open(output, 'w+') as file:
file.write(str(current_time) + '\n')
for query in QUERIES.items():
cur.execute(query[1])
table = from_db_cursor(cur)
if not re.search('countUnivers' ,query[0]):
file.write('\n' + query[0] + ':\n')
file.write(str(table) + '\n')
else:
if i < 6:
file.write(query[0] + ':\t')
tables.append(str(table))
i += 1
elif i == 6:
file.write('\n')
for t in tables:
file.write(str(table) + '\t')
i = 0
tables = []
file.write('\nDatabase:\n' + json.dumps(dbParams, indent=4) + '\n')
这段代码给我的输出是:
countUnivers1: countUnivers2: countUnivers3:
+----------+
| COUNT(*) |
+----------+
| 1681943 |
+----------+ +----------+
| COUNT(*) |
+----------+
| 51954 |
+----------+ +----------+
| COUNT(*) |
+----------+
| 4140984 |
+----------+
QUERIES是一个填充了SQL请求的有序字典:
('countUnivers1', "SELECT COUNT(*) \
FROM ourson_offer o \
WHERE o.cat LIKE '1%' \
AND CHARACTER_LENGTH(o.cat) = 7"),
就像这样。
1 个回答
1
文本是二维的:有行和行内的字符。一个“表格”其实就是一个包含换行符的Python字符串——这就是文本!换行符是在每一行结束后出现的(根据操作系统的不同,可能是CRLF、CR或LF)。
你想要做的事情需要理解字符串作为文本的结构,并且要能够垂直对齐新的块。
def pad_lines_vertically(lines, size):
''' List of lines of exactly `size` length.
Extended with empty lines if needed.
'''
orig_lines = list(lines)
assert size >= len(orig_lines)
return orig_lines + [''] * (size - len(orig_lines))
def pad_lines_horizontally(lines):
''' Pad lines to the lenght of the longest line.
'''
line_length = max(len(line) for line in lines)
return [
line.ljust(line_length)
for line in lines
]
def text_add(text1, text2, padding=' '):
lines1 = text1.splitlines()
lines2 = text2.splitlines()
line_count = max(len(lines1), len(lines2))
def pad_lines(lines):
return pad_lines_horizontally(
pad_lines_vertically(lines, line_count)
)
return '\n'.join(
''.join(line1 + padding + line2)
for line1, line2 in zip(pad_lines(lines1), pad_lines(lines2))
)
用法如下:
text1 = '''\
countUnivers1:
+----------+
| COUNT(*) |
+-------
| 1681943 |
+----------+
'''
text2 = '''\
countUnivers2:
+----------+
| COUNT(*) |
+----------+
| 51954 |
+----------+
plus a
comment
'''
print text_add(text1, text2, padding='\t')
countUnivers1: countUnivers2:
+----------+ +----------+
| COUNT(*) | | COUNT(*) |
+------- +----------+
| 1681943 | | 51954 |
+----------+ +----------+
plus a
comment