Модуль PrettyTable в Python, вывод табличных данных.
Вывод табличных данных в терминал или текстовый файл.
Модуль prettytable — полезен при создании простых таблиц и вывода их в терминал или текстовый файл. Он был вдохновлен таблицами ASCII, используемыми в оболочке PostgreSQL.
Возможности модуля prettytable :
- установка ширина заполнения столбца, выравнивание текста или граница таблицы;
- сортировка данных;
- выбор отображения столбцов и строк в окончательном выводе;
- чтение данных из CSV, HTML или курсора базы данных;
- вывод данных в ASCII или HTML.
Установка модуля PrettyTable в виртуальное окружение:
Создание таблицы и добавление данных.
Для начала, необходимо создать экземпляр PrettyTable() , а затем можно добавлять в него некоторые данные. Eсть несколько вариантов добавления данных.
Добавление данных построчно.
Можно добавлять данные по одной строке за раз. Для этого необходимо сначала установить имена полей, используя атрибут PrettyTable.field_names , а затем добавлять строки по одной, используя метод PrettyTable.add_row() :
Вид вывода таблицы в терминале
Далее будем создавать эту-же таблицу, только разными способами.
Добавление сразу всех строк.
Когда есть список строк, то можно добавить их за один раз с помощью метода PrettyTable.add_rows() :
Добавление данных колонками.
Также можно добавлять данные по одному столбцу за раз. Для этого необходимо использовать метод PrettyTable.add_column() , который принимает два аргумента — строку, которая является именем поля таблицы добавляемого столбца, и список или кортеж, содержащий данные столбца:
Импорт данных из файла CSV.
Если данные таблицы хранятся в файле CSV, то можно прочитать эти данные и добавить в таблицу PrettyTable() следующим образом:
Импорт данных из курсора базы данных.
Если данные таблицы хранятся в базе данных, к которой можно получить доступ с помощью модуля имеющего Python DB-API (например, база данных SQLite, доступная с помощью модуля sqlite3 ), то можно создать экземпляр PrettyTable() с данными, используя объект курсора, например:
Как напечатать таблицу с помощью f-string
В этой статье мы разберём как напечатать красивые таблицы:
- с одинаковой шириной колонок;
- с разной шириной колонок;
- с шапкой из двух строк.
А также создадим функции:
- с параметром максимальной ширины таблицы;
- для записи таблицы в текстовый файл.
«F-строки» были введены ещё в версии Python 3.6, и все уже давно, наверно, их используют в своём коде. Для тех, кто хочет освежить память, и ещё раз перечитать документацию — PEP 498 — Literal String Interpolation. Мы же будем использовать «f-строки» для вывода данных в табличном виде. Для примера возьмём данные об автомобилях с одного из онлайн-рынков такой структуры:
Таблица с одинаковой шириной колонок
Для того, чтоб данные в колонках таблицы выровнять по центру, левому или правому краю, нужно рассчитать ширину колонок и определить отступ. Давайте сделаем ширину колонок одинаковой по максимальной строке столбца и отступом в один символ.

Функция с параметром максимальной ширины таблицы
Давайте соберём наш код в функцию, но добавим ещё один параметр — максимальную ширину таблицы. И если ширина таблицы будет больше максимальной, заданной по умалчиванию — выведем сообщение. А также сделаем выравнивание текста в строках шапки таблицы по центру, в теле таблицы — по правому краю. Для этого надо всего лишь перед значением ширины строки вставить символ «^» — выравнивание по центру, «>» — выравнивание по правому краю, «<» – выравнивание по левому краю, выставлено по умолчанию.

Давайте ещё изменим вывод нашей таблицы. Колонки «Цена $» и «Пробег км» выведем с , , как разделитель тысяч.
Здесь, в 52 строке кода, в f’

Но это ещё не все возможности «спецификации формата».
Примечание: в F-string в фигурных скобках <> помещены «заменяющие поля». Двоеточие : указывает на поле format_spec , что означает нестандартный формат замены. Для него существует Мини-язык спецификации формата.
Функция для записи таблицы в текстовый файл
Часто приходится не только печатать таблицу, но и сохранять её в текстовом файле. Имея готовую функцию для печати, нетрудно переделать её для записи.
anastasia-chisteeva / 02. Вывод на одной строке
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| TASK |
| Названия столбцов, образующие «шапку» таблицы, хранятся в списке header. Выведите «шапку» на экран в таком виде: |
| | Название | EmojiXpress, млн | Instagram, млн | Твиттер, млн | |
| Используйте для этого цикл и функцию print() без переноса строки. |
| SOLUTION |
| header = ['Название', 'EmojiXpress, млн', 'Instagram, млн', 'Твиттер, млн'] |
| print('| ', end='') |
| for row in header: |
| print (row, end=' | ') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| TASK |
| Списки строк тоже можно сортировать методом sort() — они расположатся в алфавитном порядке. Расставьте названия всех эмодзи по алфавиту |
| и выведите список на экран, печатая каждый элемент с новой строки: |
| Глаза-сердца |
| Громко плачу |
| Два сердца |
| . |
| Червы |
| Список названий хранится в переменной emoji_names. |
| SOLUTION |
| emoji_names = [ |
| 'Ухмыляюсь', |
| 'Сияю от радости', |
| 'Катаюсь от смеха', |
| 'Слёзы радости', |
| 'Подмигиваю', |
| 'Счастлив', |
| 'Глаза-сердца', |
| 'Целую', |
| 'Задумчивость', |
| 'Равнодушие', |
| 'Солнечные очки', |
| 'Громко плачу', |
| 'След от поцелуя', |
| 'Два сердца', |
| 'Сердце', |
| 'Червы', |
| 'Класс', |
| 'Пожимаю плечами', |
| 'Огонь', |
| 'Переработка', |
| ] |
| emoji_names.sort() |
| for name in emoji_names: |
| print(name) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| TASK |
| Напечатайте на экране список количества постов в Твиттере в порядке убывания (сначала большие значения, потом поменьше). Каждое значение |
| выводите на отдельной строке. |
| SOLUTION |
| twitter = [ |
| 87.3, |
| 150, |
| 0.0, |
| 2270.0, |
| 264.0, |
| 565.0, |
| 834.0, |
| 432.0, |
| 0.0, |
| 478.0, |
| 198.0, |
| 654.0, |
| 98.7, |
| 445.0, |
| 1080.0, |
| 697.0, |
| 227.0, |
| 0.0, |
| 150.0, |
| 932.0, |
| ] |
| twitter.sort(reverse=True) |
| for i in twitter: |
| print (i) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| TASK 1 |
| Отсортируйте таблицу по столбцу «Instagram, млн» по убыванию и выведите её в наглядном формате (см. прекод). Обратите внимание, |
| какие эмодзи наиболее популярны на этой платформе. |
| SOLUTION |
| data = [ |
| ['Ухмыляюсь', 2.26, 1.02, 87.3], |
| ['Сияю от радости', 19.1, 1.69, 150.0], |
| ['Катаюсь от смеха', 25.6, 0.774, 0.0], |
| ['Слёзы радости', 233.0, 7.31, 2270.0], |
| ['Подмигиваю', 15.2, 2.36, 264.0], |
| ['Счастлив', 22.7, 4.26, 565.0], |
| ['Глаза-сердца', 64.6, 11.2, 834.0], |
| ['Целую', 87.5, 5.13, 432.0], |
| ['Задумчивость', 6.81, 0.636, 0.0], |
| ['Равнодушие', 6.0, 0.236, 478.0], |
| ['Солнечные очки', 4.72, 3.93, 198.0], |
| ['Громко плачу', 24.7, 1.35, 654.0], |
| ['След от поцелуя', 21.7, 2.87, 98.7], |
| ['Два сердца', 10.0, 5.69, 445.0], |
| ['Сердце', 118.0, 26.0, 1080.0], |
| ['Червы', 3.31, 1.82, 697.0], |
| ['Класс', 23.1, 3.75, 227.0], |
| ['Пожимаю плечами', 1.74, 0.11, 0.0], |
| ['Огонь', 4.5, 2.49, 150.0], |
| ['Переработка', 0.0333, 0.056, 932.0], |
| ] |
| data.sort(key=lambda row: row[2], reverse=True) |
| print('Название эмодзи | EmojiXpress, млн |', end='') |
| print(' Instagram, млн | Твиттер, млн') |
| print('————————————-', end='') |
| print('——————————') |
| for row in data: |
| print( |
| ' <: <16>| <: >16.2f>| <: >14.2f>| <: >12.2f>'.format( |
| row[0], row[1], row[2], row[3] |
| ) |
| ) |
| TASK 2 |
| Отсортируйте таблицу по столбцу «Твиттер, млн» по убыванию и выведите её в наглядном формате (см. прекод). Обратите внимание, |
| какие эмодзи наиболее популярны на этой платформе. Какой артефакт (необычный объект) выделяется особо? |
| SOLUTION |
| data.sort(key=lambda row: row[3], reverse=True) |
| print('Название эмодзи | EmojiXpress, млн |', end='') |
| print(' Instagram, млн | Твиттер, млн') |
| print('————————————-', end='') |
| print('——————————') |
| for row in data: |
| print( |
| ' <: <16>| <: >16.2f>| <: >14.2f>| <: >12.2f>'.format( |
| row[0], row[1], row[2], row[3] |
| ) |
| ) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| TASK 1 |
| Сделайте срез, чтобы получить из списка следующие значения: «Глаза-сердца», «Целую», «Задумчивость». |
| SOLUTION |
| emoji_names = [ |
| 'Ухмыляюсь', |
| 'Сияю от радости', |
| 'Катаюсь от смеха', |
| 'Слёзы радости', |
| 'Подмигиваю', |
| 'Счастлив', |
| 'Глаза-сердца', |
| 'Целую', |
| 'Задумчивость', |
| 'Равнодушие', |
| ] |
| print(emoji_names[6:9]) |
| TASK 2 |
| Обновите код, чтобы в каждом из трёх случаев выводилась не вся таблица, а только её первые пять строк. |
| SOLUTION |
| data.sort(key=lambda row: row[1], reverse=True) |
| # мы оставили только тот столбец, по которому сортировали |
| print('Название эмодзи | Emojixpress, млн') |
| print('————————————') |
| for row in data[:5]: |
| print(' <: <16>| <: >16.2f>'.format(row[0], row[1])) |
| print() |
| print() |
| data.sort(key=lambda row: row[2], reverse=True) |
| # мы оставили только тот столбец, по которому сортировали |
| print('Название эмодзи | Instagram, млн') |
| print('———————————') |
| for row in data[:5]: |
| print(' <: <16>| <: >14.2f>'.format(row[0], row[2])) |
| print() |
| print() |
| data.sort(key=lambda row: row[3], reverse=True) |
| # мы оставили только тот столбец, по которому сортировали |
| print('Название эмодзи | Твиттер, млн') |
| print('——————————-') |
| for row in data[:5]: |
| print(' <: <16>| <: >12.2f>'.format(row[0], row[3])) |
| print() |
| print() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| TASK |
| Некоторые ячейки в столбце с данными Твиттера принимают нулевые значения. Это связано с тем, что эмодзи редко используются и в источнике |
| отсутствует информация о них. Нулевые значения не всегда удобны на практике — например, на них нельзя делить. Так как настоящие значения |
| неизвестны, можно прибавить ко всем очень маленькую величину. Это исправит проблему, а значения для остальных ячеек сильно не испортятся. |
| Измените значения списка twitter: прибавьте к каждому элементу 0.001. Напечатайте на экране результат. |
| SOLUTION |
| twitter = [ |
| 87.3, |
| 150, |
| 0.0, |
| 2270.0, |
| 264.0, |
| 565.0, |
| 834.0, |
| 432.0, |
| 0.0, |
| 478.0, |
| 198.0, |
| 654.0, |
| 98.7, |
| 445.0, |
| 1080.0, |
| 697.0, |
| 227.0, |
| 0.0, |
| 150.0, |
| 932.0, |
| ] |
| for i in range(len(twitter)): |
| twitter[i] = twitter[i]+0.001 |
| print(twitter) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| TASK 1 |
| Добавьте в список названий emoji ещё три следующих элемента, используя метод append(). Выведите результат на экран. |
| SOLUTION |
| emoji = [ |
| 'Ухмыляюсь', |
| 'Сияю от радости', |
| 'Катаюсь от смеха', |
| 'Слёзы радости', |
| 'Подмигиваю', |
| ] |
| emoji.append('Счастлив') |
| emoji.append('Глаза-сердца') |
| emoji.append('Целую') |
| print(emoji) |
| TASK 2 |
| Создайте в таблице новый столбец: суммарное количество использований на всех платформах. Отсортируйте таблицу по нему по убыванию и напечатайте на экране первые пять элементов. Вывод уже описан в коде: |
| Название эмодзи | Суммарное использование, млн |
| ——————————————————- |
| Слёзы радости | . |
| Сердце | . |
| . |
| Проанализируйте статистику использования эмодзи по новой величине. |
| SOLUTION |
| for i in range(len(data)): |
| summ = data[i][1]+data[i][2]+data[i][3] |
| data[i].append(summ) |
| data.sort(key=lambda i: i[4], reverse=True) |
| print('Название эмодзи | Суммарное использование, млн') |
| print('————————————————') |
| for row in data[:5]: |
| print(' <: <16>| <: >28.2f>'.format(row[0], row[4])) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| TASK 1 |
| Посчитайте средние значения для всех трёх платформ и сохраните их в переменных emojixpress_mean, instagram_mean и twitter_mean |
| соответственно (напомним: англ. mean, здесь в значении «средний»). Напечатайте их значения на экране (см. код). |
| SOLUTION |
| data = [ |
| ['Ухмыляюсь', 2.26, 1.02, 87.3], |
| ['Сияю от радости', 19.1, 1.69, 150.0], |
| ['Катаюсь от смеха', 25.6, 0.774, 0.0], |
| ['Слёзы радости', 233.0, 7.31, 2270.0], |
| ['Подмигиваю', 15.2, 2.36, 264.0], |
| ['Счастлив', 22.7, 4.26, 565.0], |
| ['Глаза-сердца', 64.6, 11.2, 834.0], |
| ['Целую', 87.5, 5.13, 432.0], |
| ['Задумчивость', 6.81, 0.636, 0.0], |
| ['Равнодушие', 6.0, 0.236, 478.0], |
| ['Солнечные очки', 4.72, 3.93, 198.0], |
| ['Громко плачу', 24.7, 1.35, 654.0], |
| ['След от поцелуя', 21.7, 2.87, 98.7], |
| ['Два сердца', 10.0, 5.69, 445.0], |
| ['Сердце', 118.0, 26.0, 1080.0], |
| ['Червы', 3.31, 1.82, 697.0], |
| ['Класс', 23.1, 3.75, 227.0], |
| ['Пожимаю плечами', 1.74, 0.11, 0.0], |
| ['Огонь', 4.5, 2.49, 150.0], |
| ['Переработка', 0.0333, 0.056, 932.0], |
| ] |
| emojixpress = 0 |
| instagram = 0 |
| twitter = 0 |
| for i in range(len(data)): |
| emojixpress += data[i][1] |
| instagram += data[i][2] |
| twitter += data[i][3] |
| emojixpress_mean = emojixpress/len(data) |
| instagram_mean = instagram/len(data) |
| twitter_mean = twitter/len(data) |
| print('Среднее для EmojiXpress: <:.2f>'.format(emojixpress_mean)) |
| print('Среднее для Instagram: <:.2f>'.format(instagram_mean)) |
| print('Среднее для Твиттера: <:.2f>'.format(twitter_mean)) |
| TASK 2 |
| Вычислите «индекс использования» для каждого эмодзи. Получившийся столбец с этими индексами добавьте к таблице. |
| (Мы уже написали код для вывода на экран, пока без сортировки). |
| SOLUTION |
| emojixpress_sum = 0 |
| instagram_sum = 0 |
| twitter_sum = 0 |
| for row in data: |
| emojixpress_sum += row[1] |
| instagram_sum += row[2] |
| twitter_sum += row[3] |
| emojixpress_mean = emojixpress_sum / len(data) |
| instagram_mean = instagram_sum / len(data) |
| twitter_mean = twitter_sum / len(data) |
| for i in range(len(data)): |
| emojixpress_normalized = data[i][1]/emojixpress_mean |
| instagram_normalized = data[i][2]/instagram_mean |
| twitter_normalized = data[i][3]/twitter_mean |
| index = emojixpress_normalized + instagram_normalized + twitter_normalized |
| data[i].append(index) |
| print('Название эмодзи | Индекс использования') |
| print('—————————————') |
| for row in data: |
| print(' <: <16>| <: >20.2f>'.format(row[0], row[4])) |
| TASK 3 |
| Финальный шаг для получения отчёта: отсортируйте таблицу по новому столбцу и напечатайте на экране только первые пять элементов. |
| Мы добавили в код вывод первых пяти элементов для трёх исходных столбцов. |
| Вывод должен выглядеть так: |
| Название эмодзи | Emojixpress, млн |
| ———————————— |
| . |
| Название эмодзи | Instagram, млн |
| ——————————— |
| . |
| Название эмодзи | Твиттер, млн |
| ——————————- |
| . |
| Название эмодзи | Индекс использования |
| ————————————— |
| . |
| SOLUTION |
| emojixpress_sum = 0 |
| instagram_sum = 0 |
| twitter_sum = 0 |
| for row in data: |
| emojixpress_sum += row[1] |
| instagram_sum += row[2] |
| twitter_sum += row[3] |
| emojixpress_mean = emojixpress_sum / len(data) |
| instagram_mean = instagram_sum / len(data) |
| twitter_mean = twitter_sum / len(data) |
| for i in range(len(data)): |
| emojixpress_normalized = data[i][1] / emojixpress_mean |
| instagram_normalized = data[i][2] / instagram_mean |
| twitter_normalized = data[i][3] / twitter_mean |
| index = emojixpress_normalized + instagram_normalized + twitter_normalized |
| data[i].append(index) |
| data.sort(key=lambda row: row[1], reverse=True) |
| print('Название эмодзи | Emojixpress, млн') |
| print('————————————') |
| for row in data[:5]: |
| print(' <: <16>| <: >16.2f>'.format(row[0], row[1])) |
| print() |
| print() |
| data.sort(key=lambda row: row[2], reverse=True) |
| print('Название эмодзи | Instagram, млн') |
| print('———————————') |
| for row in data[:5]: |
| print(' <: <16>| <: >14.2f>'.format(row[0], row[2])) |
| print() |
| print() |
| data.sort(key=lambda row: row[3], reverse=True) |
| print('Название эмодзи | Твиттер, млн') |
| print('——————————-') |
| for row in data[:5]: |
| print(' <: <16>| <: >12.2f>'.format(row[0], row[3])) |
| print() |
| print() |
| data.sort(key=lambda row: row[4], reverse=True) |
| print('Название эмодзи | Индекс использования') |
| print('—————————————') |
| # обновите этот код |
| for row in data[:5]: |
| print(' <: <16>| <: >20.2f>'.format(row[0], row[4])) |
| print() |
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.