Создание таблиц в Python: подробные примеры

Раздел: Основы Python -> Форматированный вывод и таблицы

Основное решение: библиотека tabulate

Для быстрого и красивого вывода таблиц в консоль наиболее эффективным вариантом является библиотека tabulate. Она автоматически выравнивает столбцы, поддерживает заголовки, различные стили оформления и работает с разными типами данных (списки, словари, списки словарей). Установка: pip install tabulate.

from tabulate import tabulate

data = [
    ["Alice", 25, "Engineer"],
    ["Bob", 30, "Designer"],
    ["Charlie", 22, "Student"]
]
headers = ["Name", "Age", "Job"]
print(tabulate(data, headers=headers, tablefmt="grid"))

таблица в python примеры (примеры создания таблиц в python)

+---------+-------+-----------+
| Name    |   Age | Job       |
+=========+=======+===========+
| Alice   |    25 | Engineer  |
+---------+-------+-----------+
| Bob     |    30 | Designer  |
+---------+-------+-----------+
| Charlie |    22 | Student   |
+---------+-------+-----------+

Параметр tablefmt управляет внешним видом: "grid", "simple", "plain", "pipe", "orgtbl" и др. Для работы с большими объёмами данных библиотека достаточно производительна.

Альтернативные подходы

Как вывести таблицу без дополнительных библиотек?

Ручное форматирование с использованием циклов и f-строк.

data = [["Alice", 25], ["Bob", 30]]
for row in data:
    print(f"{row[0]:<10} {row[1]:>5}")
Alice           25
Bob             30

Проблемы: сложность выравнивания нескольких столбцов, необходимость задавать ширину вручную, отсутствие границ.

Как использовать метод format для таблиц?

Метод str.format с шаблоном строки.

header = "{:<10} {:>5}".format("Name", "Age")
rows = ["{:<10} {:>5}".format(*r) for r in data]
print(header)
print("-"*16)
for r in rows: print(r)
Name         Age
----------------
Alice         25
Bob           30

Подходит для простых случаев, но каждый раз требуется пересчитывать ширину.

Какая библиотека даёт больше контроля над стилем?

Библиотека prettytable позволяет менять цвета, границы, выравнивание отдельных столбцов.

from prettytable import PrettyTable

pt = PrettyTable()
pt.field_names = ["Name", "Age", "Job"]
pt.add_rows([
    ["Alice", 25, "Engineer"],
    ["Bob", 30, "Designer"]
])
pt.align["Name"] = "l"
pt.align["Age"] = "r"
print(pt)
+-------+-----+----------+
| Name  | Age | Job      |
+-------+-----+----------+
| Alice |  25 | Engineer |
| Bob   |  30 | Designer |
+-------+-----+----------+

Установка: pip install prettytable.

Как вывести таблицу из DataFrame?

Pandas предоставляет встроенный метод to_string() с настройкой выравнивания.

import pandas as pd

df = pd.DataFrame(data, columns=["Name", "Age"])
print(df.to_string(index=False))
   Name  Age
  Alice   25
    Bob   30

Подходит, если данные уже в DataFrame. Для вывода в консоль используется tabulate внутри pandas.

Типичные проблемы и их решения

  • Разная ширина символов (кириллица). В консоли символы могут отображаться неровно. Рекомендуется использовать библиотеки (tabulate, prettytable), которые корректно считают длину строки.
  • Несоответствие типов данных. Если в таблице встречаются числа и строки, ручное форматирование может давать ошибки. Решение: явное приведение к строке или использование библиотек.
  • Производительность. Для тысяч строк prettytable может работать медленно. tabulate и pandas быстрее.
  • Отсутствие заголовков. При ручном выводе легко забыть заголовки. Библиотеки решают эту проблему автоматически.

Расширенные примеры создания таблиц

1. Tabulate: разные стили и работа со словарями

Пример
from tabulate import tabulate

# Словарь данных
data = {
    "Name": ["Alice", "Bob", "Charlie"],
    "Age": [25, 30, 22],
    "City": ["New York", "London", "Paris"]
}

# Вывод в стиле "pipe" (Markdown)
print(tabulate(data, headers="keys", tablefmt="pipe"))
| Name    |   Age | City     |
|:--------|------:|:---------|
| Alice   |    25 | New York |
| Bob     |    30 | London   |
| Charlie |    22 | Paris    |

2. PrettyTable: группировка строк и сортировка

Пример
from prettytable import PrettyTable

pt = PrettyTable()
pt.field_names = ["Product", "Price", "Quantity"]
pt.add_rows([
    ["Apple", 1.5, 10],
    ["Banana", 0.8, 20],
    ["Orange", 1.2, 15]
])
pt.sortby = "Price"
pt.reversesort = True
pt.float_format = ".2"
print(pt)
+---------+-------+----------+
| Product | Price | Quantity |
+---------+-------+----------+
|  Apple  |  1.50 |     10   |
| Orange  |  1.20 |     15   |
| Banana  |  0.80 |     20   |
+---------+-------+----------+

3. Ручное форматирование с динамической шириной

Пример
data = [
    ["Name", "Age", "Job"],
    ["Alice", 25, "Engineer"],
    ["Bob", 30, "Designer"]
]

# Вычисление максимальной ширины для каждого столбца
col_widths = [max(len(str(row[i])) for row in data) for i in range(len(data[0]))]

# Формирование разделителя
separator = "+".join("-" * (w + 2) for w in col_widths)
separator = f"+{separator}+"

# Вывод
print(separator)
for i, row in enumerate(data):
    row_str = "|".join(f" {str(row[j]).ljust(col_widths[j])} " for j in range(len(row)))
    print(f"|{row_str}|")
    if i == 0:
        print(separator)
print(separator)
+---------+-----+-----------+
| Name    | Age | Job       |
+---------+-----+-----------+
| Alice   | 25  | Engineer  |
| Bob     | 30  | Designer  |
+---------+-----+-----------+

4. Pandas: настройка вывода и экспорт

Пример
import pandas as pd

df = pd.DataFrame({
    "Город": ["Москва", "СПб", "Новосибирск"],
    "Население (млн)": [12.6, 5.4, 1.6],
    "Год основания": [1147, 1703, 1893]
})

# Вывод с ограничением ширины колонок
pd.set_option("display.max_colwidth", 15)
print(df.to_string(index=False))
    Город  Население (млн)  Год основания
  Москва             12.6            1147
     СПб              5.4            1703
Новосибирск           1.6            1893

5. Комбинирование tabulate и PrettyTable с цветами (termcolor)

Пример
from tabulate import tabulate
from termcolor import colored

headers = ["ID", "Name", "Score"]
data = [[1, "Alice", 95], [2, "Bob", 88], [3, "Charlie", 72]]

# Окрашивание заголовков
table = tabulate(data, headers=headers, tablefmt="grid")
lines = table.split("\n")
for i, line in enumerate(lines):
    if i == 1:  # строка с заголовками
        print(colored(line, "cyan"))
    else:
        print(line)
[цветная строка заголовков в консоли]
+------+---------+-------+
| ID   | Name    | Score |
+------+---------+-------+
|    1 | Alice   |    95 |
|    2 | Bob     |    88 |
|    3 | Charlie |    72 |
+------+---------+-------+

6. Вывод таблицы из текстового файла (CSV) с помощью csv+tabulate

Пример
import csv
from tabulate import tabulate

with open("data.csv", newline="") as f:
    reader = csv.reader(f)
    headers = next(reader)
    rows = list(reader)

print(tabulate(rows, headers=headers, tablefmt="grid"))
+----+--------+------+
| ID | Name   | Age  |
+====+========+======+
|  1 | Alice  |   25 |
|  2 | Bob    |   30 |
+----+--------+------+

Примеры создания таблиц в Python - comments

En
таблица в python примеры (python)