Python PrettyTable 在同一行打印表格

0 投票
1 回答
2986 浏览
提问于 2025-04-20 10:23

我正在使用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

撰写回答