PrettyTable — вывод табличных данных в ASCII

PrettyTable - вывод табличных данных в ASCII

PrettyTable — это библиотека Python, разработанная для простого и быстрого отображения табличных данных в визуально удобных таблицах ASCII.

Введение

По словам автора библиотеки он был очень вдохновлен таблицами ASCII, используемых в оболочке PostgreSQL. PrettyTable позволяет выбирать, какие столбцы должны быть напечатаны, производить независимое выравнивание столбцов, а так же печать частично таблицы путем указания диапазона строк.

Установка

Существует возможность установить стабильную версию или же экспериментальную, на ваш выбор, воспользуемся для этого пакетным менеджером

Стабильная версия

Воспользуемся пакетным менеджером pip для установки из репозитория

pip install -U prettytable

Эксперементальная версия

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

pip install -U git+https://github.com/jazzband/prettytable

Использование

Создадим объект prettytable или другими словами пустую таблицу.

from prettytable import PrettyTable
x = PrettyTable()

Для того чтобы поместить в него наши данные, у нас есть несколько способов это выполнить.

Построчный ввод

Вы можете добавлять данные по одной строке за раз. Для этого можно сначала задать имена полей с помощью атрибута field_names, а затем добавить строки по одной с помощью метода add_row:

x.field_names = ["Сотрудник", "Возраст", "Должность", "Оклад"]
x.add_row(["Николай", 43, "Плотник", 25000])
x.add_row(["Андрей", 29, "Менеджер", 30000])
x.add_row(["Анатолий", 19, "Практикант", 12500])
x.add_row(["Юлия", 27, "Секретарь", 35000])
x.add_row(["Наталья", 35, "Руководитель отдела продаж", 40000])
x.add_row(["Екатерина", 30, "Менеджер", 27000])
x.add_row(["Георгий", 44, "Охранник", 17500])

Ввод данных по одному столбцу

Вы также можете добавлять данные по одному столбцу за раз. Для этого используется метод add_column, который принимает два аргумента, название столбца и список или кортеж, содержащий значения.

x.add_column("Сотрудник", ["Николай", "Андрей", "Анатолий", "Юлия", "Наталья", "Екатерина", "Георгий"])
x.add_column("Возраст", [43, 29, 19, 27, 35, 30, 44])
x.add_column("Должность", ["Плотник", "Менеджер", "Практикант", "Секретарь", "Руководитель отдела продаж", "Менеджер", "Охранник"])
x.add_column("Annual Оклад", [25000, 30000, 12500, 35000, 40000, 27000, 17500])

Импорт данных из CSV-файла

Если вы храните данные в таблицах CSV вы можете прочитать эти данные в красивую таблицу всего парой строк кода:

from prettytable import from_csv

f = open("table.csv", "r")
table = from_csv(f)
f.close()

Импорт из базы данных

Если вы храните информацию в реляционных базах данных, то при наличии поддержки Python DB-API в реализации ее библиотеке вы сможете импортировать их в таблицу с помощью объекта курсора

import sqlite3
from prettytable import from_cursor

conn = sqlite3.connect("db.sqlite3")
cur = conn.cursor()
cur.execute("SELECT field FROM table WHERE id=1")
x = from_cursor(cur)

Удаление данных

Существует три способа удаления данных

  • Метод del_row принимает целочисленный индекс одной строки для удаления.
  • Метод clear_rows не принимает аргументов и удаляет все строки в таблице, но сохраняет имена полей такими, какими они были, чтобы вы могли повторно заполнить их данными.
  • Метод clear не принимает аргументов и удаляет все строки и все имена полей. Это не совсем то же самое, что создание нового экземпляра таблицы, хотя связанные со стилем настройки сохраняются.

Отображение вашей таблицы в ASCII

Основная цель PrettyTable — позволить вам печатать таблицы в привлекательной форме ASCII, например так:

+-----------+---------+----------------------------+-------+
 | Сотрудник | Возраст |         Должность          | Оклад |
 +-----------+---------+----------------------------+-------+
 |  Николай  |    43   |          Плотник           | 25000 |
 |   Андрей  |    29   |          Менеджер          | 30000 |
 |  Анатолий |    19   |         Практикант         | 12500 |
 |    Юлия   |    27   |         Секретарь          | 35000 |
 |  Наталья  |    35   | Руководитель отдела продаж | 40000 |
 | Екатерина |    30   |          Менеджер          | 27000 |
 |  Георгий  |    44   |          Охранник          | 17500 |
 +-----------+---------+----------------------------+-------+

Распечатать таблицу в формате ASCII очень просто, достаточно сделать это:

print(x)

Заключение

Мы рассмотрели библиотеку PrettyTable, варианты ее установки, принципы использования, построчный ввод, импорт данных из csv таблицы и базы данных.

Это не полный функционал, более подробную информацию об использование параметров таблицы, сортировки данных, печать в другие форматы (HTML/JSON) вы можете найти на официальной странице разработчика

Егор Егоров

Программирую на Python с 2017 года. Люблю создавать контент, который помогает людям понять сложные вещи. Не представляю жизнь без непрерывного цикла обучения, спорта и чувства юмора.

Ссылка на мой github есть в шапке. Залетай.

Оцените автора
Егоров Егор
Добавить комментарий

  1. Денис

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

    Ответить
    1. Денис

      +————+———+—————————-+——-+
      | Сотрудник | Возраст | Должность | Оклад |
      +————+———+—————————-+——-+
      | Николай | 43 | Плотник | 25000 |
      | Андрей | 29 | Менеджер | 30000 |

      А на выходе csv, допустим.
      ???

      Ответить
      1. Егор Егоров автор

        Интересный вопрос, я бы не искал какого то готового решения, потому что такие данные и построчно можно обработать. Ищи строки, которые начинаются с символа | и разбивай их методом split. Потом пройдись по каждому элементу и убери ненужные пробелы с двух сторон методом strip. В итоге получишь список списков и можешь так же поэлементно их записывать в csv, используя в качестве разделителя нужный символ.

        Ответить
        1. Денис

          Такие данные действительно легко построчно обработать, но вот если «чуть-чуть» расширить задачу:

          Ответить
          1. Денис

            ┌———————┬———————————————————————————————————————┬———————————————————————┐
            │ N │ Наименование пищевой продукции или │ Итого за сутки │
            │ │ группы пищевой продукции ├———————————┬———————————┤
            │ │ │ 1-3 года │ 3-7 лет │
            ├———————┼———————————————————————————————————————┼———————————┼———————————┤

            │ 1 │Молоко, молочная и кисломолочные │ 390 │ 450 │
            │ │продукция │ │ │
            ├———————┼———————————————————————————————————————┼———————————┼———————————┤

            │ 2 │Творог (5% — 9% м.д.ж.) │ 30 │ 40 │
            ├———————┼———————————————————————————————————————┼———————————┼———————————┤

            Ответить
            1. Егор Егоров автор

              Тут уже сложно.

              Структура этой таблицы нарушена, названия столбцов размазаны на 2 строки, 1 строка таблицы так же, а вторая строка вообще не имеет части столбцов. Построчная обработка по шаблону уже не подойдет.

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

              Можно посмотреть в сторону машинного обучения и классификации данных, но думаю это какой-то оверхед, проще согласовать формат данных и использовать более «машиночитаемые» форматы вывода данных.

              Ответить
  2. Миха

    спасибо большое!

    Ответить
    1. Егор Егоров автор

      Пожалуйста!

      Ответить