Python的文本表编写器/打印机

Gam*_*iac 8 python printing

TL; DR - > PyPi上是否有一个表写模块(我找不到),它将列表作为参数并从这些列表中创建一个表.我问这个是因为我看过PyPI,但是我没有发现任何类似于实际打印字符串或将字符串写入文件的内容.

想象一下,有很多统计数据,并且不得不把它们整齐地写在一张桌子里,就像这样,(我一直在努力教一个关于不同排序算法之间差异的课程)(另外,请注意这个例子)这里给出的代码与下面给出的代码的输出不匹配.我简单地完成了这个,以便解释我想要的东西,而不是制作一个必须滚动的大块代码):

#########################
#   LENGTH ||| TIME(s)  #
#########################
#       0  ||| 0.00000  #
#     250  ||| 0.00600  #
#     500  ||| 0.02100  #
#     750  ||| 0.04999  #
#    1000  ||| 0.08699  #
#    1250  ||| 0.13499  #
#    1500  ||| 0.19599  #
#    1750  ||| 0.26900  #
#    2000  ||| 0.35099  #
#########################
Run Code Online (Sandbox Code Playgroud)

理想情况下,我会写这样的东西保存到文件,如下所示.列表集,一个列表包含一组值,另一个列表包含另一组相应的值.

if __name__ == '__main__':
    with open(os.path.join(os.path.dirname(__file__), 'Sort Stats', 'stats_exp.txt'), 'w') as stats:
        stats.write(
            "O-######################==#######################==#######################==######################-O\n")
        stats.writelines(
            "|{0:^23}||{1:^23}||{2:^23}||{3:^23}|\n".format("Bubble Sort", "Insertion Sort", "Merge Sort (R)",
                                                            "Merge Sort (I)"))
        stats.write(
            "|#######################||#######################||#######################||#######################|\n")
        stats.write(
            "|   LENGTH  |  TIME(s)  ||   LENGTH  |  TIME(s)  ||   LENGTH  |  TIME(s)  ||   LENGTH  |  TIME(s)  |\n")
        stats.write(
            "|#######################||#######################||#######################||#######################|\n")
        for times_taken, t1, t2, t3, t4 in zip(total_lengths, sort_times_bubble, sort_times_ins, sort_times_merge_r,
                                               sort_times_merge_i):
            stats.write(
                "|{0:^11}|{1:^11}||{2:^11}|{3:^11}||{4:^11}|{5:^11}||{6:^11}|{7:^11}|\n"
                .format(
                    times_taken, str(t1)[:6],
                    times_taken, str(t2)[:6],
                    times_taken, str(t3)[:6],
                    times_taken, str(t4)[:6],
                )
            )
        stats.write(
            "O-######################==#######################==#######################==######################-O\n")

    print "Data writing complete"
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它并不完全漂亮,最重要的是它并不容易扩展,因为它几乎可以打印出来.

我想要做的是为此创建一个模块并将其上传到PyPI.然而,如果有人已经做了类似于此的事情,那么这将是浪费的努力,我可以简单地分叉他们的存储库而不是实际上必须从头开始编写代码.

ale*_*cxe 20

PrettyTable模块是您所需要的:

PrettyTable是一个简单的Python库,旨在快速轻松地在视觉上吸引人的ASCII表中表示表格数据.

>>> import prettytable
>>> x = prettytable.PrettyTable(["Length", "Time"])
>>> x.add_row([0, 0.00000])
>>> x.add_row([250, 0.00600]) 
>>> x.add_row([500, 0.02100]) 
>>> x.add_row([750, 0.04999])    
>>> print x
+--------+---------+
| Length |   Time  |
+--------+---------+
|   0    |   0.0   |
|  250   |  0.006  |
|  500   |  0.021  |
|  750   | 0.04999 |
+--------+---------+
Run Code Online (Sandbox Code Playgroud)

或者,texttable:

texttable是一个使用ASCII字符生成格式化文本表的模块.

>>> import texttable
>>> x = texttable.Texttable()
>>> x.add_rows([["Length", "Time"], [0, 0.00000], [250, 0.00600], [500, 0.02100], [750, 0.04999]])
>>> print x.draw()
+--------+-------+
| Length | Time  |
+========+=======+
| 0      | 0     |
+--------+-------+
| 250    | 0.006 |
+--------+-------+
| 500    | 0.021 |
+--------+-------+
| 750    | 0.050 |
+--------+-------+
Run Code Online (Sandbox Code Playgroud)

另请参阅相关主题:如何使用Python漂亮地打印ASCII表?


pok*_*oke 5

我只是要向我提出一个解决方案,我上周实际上已经写过这个解决方案.它目前正确对齐所有内容,但它足够简单,可以添加一些对齐参数或其他东西.

def printTable (tbl, borderHorizontal = '-', borderVertical = '|', borderCross = '+'):
    cols = [list(x) for x in zip(*tbl)]
    lengths = [max(map(len, map(str, col))) for col in cols]
    f = borderVertical + borderVertical.join(' {:>%d} ' % l for l in lengths) + borderVertical
    s = borderCross + borderCross.join(borderHorizontal * (l+2) for l in lengths) + borderCross

    print(s)
    for row in tbl:
        print(f.format(*row))
        print(s)
Run Code Online (Sandbox Code Playgroud)

例:

>>> x = [['Length', 'Time(ms)'], [0, 0], [250, 6], [500, 21], [750, 50], [1000, 87], [1250, 135], [1500, 196], [1750, 269], [2000, 351]]
>>> printTable(x)
+--------+----------+
| Length | Time(ms) |
+--------+----------+
|      0 |        0 |
+--------+----------+
|    250 |        6 |
+--------+----------+
|    500 |       21 |
+--------+----------+
|    750 |       50 |
+--------+----------+
|   1000 |       87 |
+--------+----------+
|   1250 |      135 |
+--------+----------+
|   1500 |      196 |
+--------+----------+
|   1750 |      269 |
+--------+----------+
|   2000 |      351 |
+--------+----------+
Run Code Online (Sandbox Code Playgroud)