Писатель текстовых таблиц / принтер для Python

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 # ######################### 

В идеале я бы написал что-то вроде этого, чтобы сохранить файл, как показано ниже. набор списков, один список содержит один набор значений, другой – другой набор соответствующих значений.

 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" 

Как вы можете видеть, это не совсем красиво, и, самое главное, это не то, что легко расширить, так как оно в значительной степени печатает что-то.

Я хочу создать модуль для этого и загрузить его в PyPI. Однако, если кто-то уже сделал что-то похожее на это, тогда это будет потрачено впустую, и я мог бы просто разблокировать их хранилища, вместо того чтобы фактически писать код с нуля.

2 Solutions collect form web for “Писатель текстовых таблиц / принтер для Python”

Модуль 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 | +--------+---------+ 

Или текстовая таблица :

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 | +--------+-------+ 

Также см. Соответствующую тему: Как я могу печатать таблицы ASCII с Python?

Я просто собираюсь бросить решение от меня, в котором я на самом деле написал на прошлой неделе, чтобы проверить что-то. В настоящий момент это выравнивание по правому краю, но было бы достаточно просто добавить некоторые параметры выравнивания или что-то еще.

 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) 

Пример:

 >>> 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 | +--------+----------+ 
Python - лучший язык программирования в мире.