Распечатать таблицу с выровненными столбцами в python - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть класс Table с кортежем header

self.header = ("Column_1", "Column_2", "Column_3", "Column_4", "Column_5")

и словарем кортежей с именем __entries, которые добавляются с помощью функции:

"""@brief Creates a new entry"""
def addEntry(self, column_1 : str , column_2 : str, column_3 : bool, column_4 : List[str], column_5 : Callable[[],None]) -> None:
    self.__entries[column_1] = (column_1, column_2, column_3, column_4, column_5)

Я хочу напечатать заголовок и все записи в виде отформатированной таблицы. Моя текущая попытка:

"""@brief Print the header and all entries as a table"""
def print(self) -> None:
    print("|\t" + self.header[0] + "\t|\t" + self.header[1] + "\t|\t" + self.header[2] + "\t|\t" + self.header[3]+ "\t|" + self.header[4]+ "\t|")
    for key in self.__entries:
        entry = self.__entries[key]
        print("|\t" + entry[0] + "\t|\t" + entry[1] + "\t|\t" + str(entry[2]) + "\t|\t" + str(entry[3]) + "\t|\t" + str(entry[4])+ "\t|")

Но, очевидно, это не изменяет размер столбцов, и поэтому программа:

def Foo() -> None:
    print(HelloWorld)

def Bar() -> None:
    print(HelloWorld)

def Baz() -> None:
    print(HelloWorld)

if __name__== "__main__":
    table = Table()
    table.addEntry("test","Craig",False,[], Foo)
    table.addEntry("test2","Bob",False,[], Bar)
    table.addEntry("test3","Bill",False,[], Baz)

    methodRegistry.print()

Выходы:

|       Column_1        |       Column_2        |       Column_3        |       Column_4        | Column_5      |
|       test    |       Craig   |       False   |       []      |       <function Foo at 0x7f1192b56e18>        |
|       test2   |       Bob     |       False   |       []      |       <function Bar at 0x7f1191464730>        |
|       test3   |       Bill    |       False   |       []      |       <function Baz at 0x7f11914647b8>        |

I Я новичок в python, но я предполагаю, что есть простой способ сделать это без необходимости вручную вычислять ширину каждой строки и корректировать ее соответствующим образом.

Полный исходный код можно найти здесь: https://gitlab.com/snippets/1936949

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Используйте хорошо известный пакет python для печати в табличном формате. Например, вы можете использовать prettytable. Вы можете установить его с помощью cmd pip install prettytable

>>> from prettytable import PrettyTable
>>> t = PrettyTable(hdrs)
>>>
>>> headers = ("Column_1", "Column_2", "Column_3", "Column_4", "Column_5")
>>> t = PrettyTable(headers)
>>> t.add_row(("test","Craig",False,[], 'Foo'))
>>> t.add_row(("test2","Bob",False,[], 'Bar'))
>>> t.add_row(("test3","Bill",False,[], 'Baz'))
>>> print(t)
+-----------+-----------+-----------+-----------+-----------+
| Column_1  | Column_2  | Column_3  | Column_4  | Column_5  |
+-----------+-----------+-----------+-----------+-----------+
|    test   |   Craig   |   False   |     []    |    Foo    |
|   test2   |    Bob    |   False   |     []    |    Bar    |
|   test3   |    Bill   |   False   |     []    |    Baz    |
+-----------+-----------+-----------+-----------+-----------+
2 голосов
/ 06 февраля 2020

Я настоятельно рекомендую вам преобразовать ваш Table в pandas Dataframe. Если вы это сделаете, получить табличное представление вашей таблицы легко, используя to_markdown:

# Generating a test table in pandas
df  = pd.DataFrame({'Column_2': {'test': 'Craig', 'test2': 'Bob', 'test3': 'Bill'},
 'Column_3': {'test': False, 'test2': False, 'test3': False},
 'Column_4': {'test': '[]', 'test2': '[]', 'test3': '[]'},
 'Column_5': {'test': '<function Foo at 0x7f9f898a0e18>',
  'test2': '<function Bar at 0x7f9f881ae730>',
  'test3': '<function Baz at 0x7f9f881ae7b8>'}})
df.index.name = 'Column_1'

# Printing the table in a nice tabular way:
print(df.to_markdown())
| Column_1   | Column_2    | Column_3    | Column_4    | Column_5                         |
|:-----------|:------------|:------------|:------------|:---------------------------------|
| test       | Craig       | False       | []          | <function Foo at 0x7f9f898a0e18> |
| test2      | Bob         | False       | []          | <function Bar at 0x7f9f881ae730> |
| test3      | Bill        | False       | []          | <function Baz at 0x7f9f881ae7b8> |

В общем, все операции с таблицами поддерживаются pandas, поэтому не рекомендуется создавать ваша собственная Table структура (если это не часть какого-то учебного курса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...