Как вывести таблицу в питоне
Перейти к содержимому

Как вывести таблицу в питоне

  • автор:

Как в Python вывести таблицу как в примере?

Да, я знаю про PrettyTable. Он хорош.
Но нигде не могу найти примера как реализовать следующее:

61a2078ef412b956718135.png

Причем границы таблицы не особо и нужны.
Нужно чтобы строчка — это строчка, но с несколькими подстроками.
У каждого ip адреса есть несколько параметров и я хочу чтобы они печатались с новой строки,
но в том же месте где такой же параметр уже напечатан в основной строке.

P.S. прочитал тонну информации про PrettyTable и аналоги — в ней нет примера соответствующего моему запросу.
Либо подскажите, пожалуйста — как получить координаты места где напечатался первый элемент списка/значение словаря?

  • Вопрос задан более двух лет назад
  • 1936 просмотров

1 комментарий

Простой 1 комментарий

А покажите сначала, какие поисковые строки вы использовали в Google для поиска ответа?
Решения вопроса 1

Vindicar

Вывести в консоль?
Ну я бы подходил к этому так.
1. Преобразовать все выводимые данные в строки и разбить их по переносам строки.
2. Определить наибольшую ширину каждого столбца с учётом переносов строки. Для каждой ячейки вычисляем наибольшую ширину строки, потом ищем максимум по столбцу. Можно добавить 1-2 символа как «поля», если надо.
3. При выводе строки, выводим строки ячеек вместе, используя itertools.zip_longest(). Т.е. сначала первую строку в каждой ячейке, потом вторую, и т.д. Если получили вместо одной из строк None, значит в этой ячейке строки уже закончились — выводим пробелы.
Ширину вывода каждой ячейки мы знаем из пункта 2, выровнять значение пробелами — тривиально.

# -*- coding: utf-8 -*- import typing as t import itertools def print_table(headers: t.Dict[str, str], data: t.Iterable[t.Dict[str, str]]) -> None: keys: t.List[str] = list(headers.keys()) #список ключей в таблице - чтобы сохранять порядок столбцов split_data: t.List[t.Dict[str, t.List[str]]] = [] #ячейки, разбитые на строки max_widths: t.Dict[str, int] = < key:len(value) for key,value in headers.items() >#ширина каждого столбца в таблице for line in data: #разбиваем ячейки строки на текстовые строки по \n split_line: t.Dict[str, t.List[str]] = < key:value.splitlines() for key,value in line.items() >#обновляем ширину столбцов, если надо for key in keys: new_width = max(map(len, split_line.get(key, ['']))) if new_width > max_widths[key]: max_widths[key] = new_width split_data.append(split_line) #выводим заголовки for key in keys: print(f'>>'.format(headers[key]), end='|') #можно вместо | поставить пробел print() print( '+'.join('-'*v for v in max_widths.values()) + '|') #разделитель заголовка и тела таблицы #выводим строки таблицы for row in split_data: for parts in itertools.zip_longest(*(row[key] for key in keys)): #parts - кортеж, где каждый элемент либо строка в очередной ячейке, либо None for key,part in zip(keys, parts): #None означает, что в этой ячейке строки текста уже кончились print(f'>>'.format(part if part is not None else ''), end='|') print() print( '+'.join('-'*v for v in max_widths.values()) + '|') #разделитель строк, если надо data = [ , , ] headers = print_table(headers, data)
IP address |Model |Uptime |Uplink state|Uplink errors|Uplink M-cast| -----------+-----------+-----------+------------+-------------+-------------| 192.168.0.2|DES-3200-26|3d 12:03:05|25: up |0 |24560 | | | |26:up |11 |113 | -----------+-----------+-----------+------------+-------------+-------------| 192.168.0.2|DES-3200-52|1d 04:00:15|49: up |10 |5497812 | | | |50:up |1133 |3145 | | | |51:down |0 |0 | | | |52:down |0 |0 | -----------+-----------+-----------+------------+-------------+-------------|

Управление выводом таблицы, модуль prettytable в Python

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

Создадим таблицу с которой будем работать:

from prettytable import PrettyTable mytable = PrettyTable() mytable.field_names = ["City name", "Area", "Population", "Annual Rainfall"] mytable.add_rows( [ ["Adelaide", 1295, 1158259, 600.5], ["Brisbane", 5905, 1857594, 1146.4], ["Darwin", 112, 120900, 1714.7], ["Hobart", 1357, 205556, 619.5], ] ) 

Управление выводом данных таблицы осуществляется методом PrettyTable.get_string() .

Управление выводом колонок.

Аргумент fields метода PrettyTable.get_string() принимает список имен полей, которые нужно напечатать:

>>> table = mytable.get_string(fields=["City name", "Population"]) >>> print(table) #+-----------+------------+ #| City name | Population | #+-----------+------------+ #| Adelaide | 1158259 | #| Brisbane | 1857594 | #| Darwin | 120900 | #| Hobart | 205556 | #+-----------+------------+ 

Управление выводом строк.

Аргументы start и end метода PrettyTable.get_string() принимают индекс первой и последней строки для печати соответственно.

Обратите внимание, что индексация работает так же, как срезы списка Python — для печати 3-й и 4-й строк таблицы установите start равным 2 (первая строка — это строка 0, поэтому третья — это строка 2) и установите end на 4 (индекс 4-ой строки, плюс 1):

>>> table = mytable.get_string(start=2, end=4) >>> print(table) #+-----------+------+------------+-----------------+ #| City name | Area | Population | Annual Rainfall | #+-----------+------+------------+-----------------+ #| Darwin | 112 | 120900 | 1714.7 | #| Hobart | 1357 | 205556 | 619.5 | #+-----------+------+------------+-----------------+ 

Управление сортировкой данных в таблице.

Аргументы sortby метода PrettyTable.get_string() , который принимает строку с именем одного поля, отсортирует данный столбец таблицы по возрастанию (от меньшего к большему).

>>> table = mytable.get_string(sortby='Area') >>> print(table) #+-----------+------+------------+-----------------+ #| City name | Area | Population | Annual Rainfall | #+-----------+------+------------+-----------------+ #| Darwin | 112 | 120900 | 1714.7 | #| Adelaide | 1295 | 1158259 | 600.5 | #| Hobart | 1357 | 205556 | 619.5 | #| Brisbane | 5905 | 1857594 | 1146.4 | #+-----------+------+------------+-----------------+ 

Если необходимо отсортировать в обратном порядке, то в метод нужно добавить ключевой аргумент reversesort=True .

>>> table = mytable.get_string(sortby='Area', reversesort=True) >>> print(table) #+-----------+------+------------+-----------------+ #| City name | Area | Population | Annual Rainfall | #+-----------+------+------------+-----------------+ #| Brisbane | 5905 | 1857594 | 1146.4 | #| Hobart | 1357 | 205556 | 619.5 | #| Adelaide | 1295 | 1158259 | 600.5 | #| Darwin | 112 | 120900 | 1714.7 | #+-----------+------+------------+-----------------+ 

Если необходимо, чтобы таблицы сортировались всегда определенным образом, то можно сделать этот параметр долгосрочным при помощи атрибута экземпляра класса PrettyTable.sortby :

# сортировка по колонке `Population` >>> mytable.sortby = "Population" # отсортирует вывод по колонке `Population` >>> print(mytable) 

Теперь, команда print(mytable) напечатает таблицу, отсортированную по колонке Population . Также, при помощи атрибута mytable.reversesort = True можно сортировать таблицу по колонке, указанной в mytable.sortby — в обратном порядке. Такое поведение будет сохраняться, пока не отключить сортировку атрибутом x.sortby = None .

# отключение сортировки >>> mytable.sortby = None # выведет таблицу в исходном виде >>> print(mytable) 

Если нужно указать пользовательскую функцию сортировки, то можно использовать ключевой аргумент sort_key .

Передайте аргументу sort_key функцию, которая принимает два списка значений и возвращает отрицательное или положительное значение в зависимости от того, должен ли первый список появляться до или после второго. Если в таблице n столбцов, то в каждом списке будет n + 1 элемент. Каждый список соответствует одной строке таблицы. Первым элементом будут данные из соответствующей строки в столбце, заданном аргументом sort_by . Остальные n элементов — это данные в каждом столбце таблицы по порядку, включая повторяющийся экземпляр данных в столбце sort_by .

  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Печать табличных данных в файл, модуль prettytable
  • Удаление данных из таблицы, модуль prettytable
  • Управление выводом таблицы, модуль prettytable
  • Управление внешним видом таблицы, модуль prettytable
  • Генерация HTML и JSON при помощи prettytable

Python задача. Создайте таблицу значений функции.

Если минимум задан как 1, максимум равен 10, а шаг 2. То надо вывести на экран изменение x от 1 до 10 с шагом 2 (1, 3, 5, 7, 9) и значения функции (y) при каждом значении x.

Алгоритм решения таблицы значений функции

1) Получить у пользователя значения с клавиатуры для минимума, максимума и шага
2) Выполнить цикл, который будет выполнять действия с неизвестным и выводить на экран

Как возвести число в степень в языке программирования python

В Python оператор возведения в степень обозначается двумя символами звездочки ** между основанием и числом степени.

Код для решения Таблицы значений функции

min = int(input(‘Введите минимум’))
max = int(input(«Введите максимум»))
go = int(input(«Введите шаг»))

for i in range(min,max,go):
print(0.33*i**2+i)

Как напечатать таблицу с помощью f-string

Аватарка пользователя Николай Павлюк

Разберём, как напечатать красивую таблицу с одинаковой шириной колонок, с разной шириной колонок, с шапкой из двух строк. Создадим функцию с параметром максимальной ширины таблицы и функцию для записи таблицы в текстовый файл.

В этой статье мы разберём как напечатать красивые таблицы:

  • с одинаковой шириной колонок;
  • с разной шириной колонок;
  • с шапкой из двух строк.

А также создадим функции:

  • с параметром максимальной ширины таблицы;
  • для записи таблицы в текстовый файл.

«F-строки» были введены ещё в версии Python 3.6, и все уже давно, наверно, их используют в своём коде. Для тех, кто хочет освежить память, и ещё раз перечитать документацию — PEP 498 – Literal String Interpolation. Мы же будем использовать «f-строки» для вывода данных в табличном виде. Для примера возьмём данные об автомобилях с одного из онлайн-рынков такой структуры:

data = [ ['Volkswagen', 'Golf V', '2008', '8000', '154000'], ['Mazda', 'CX-5', '2013', '14800', '117000'], ['Honda', 'CR-V AWD', '2017', '22000', '57000'], ['BMW', '320', '2015', '14700', '124000'], ['BMW', 'X1', '2012', '17000', '62000'], ['Mercedes-Benz', 'E 220', '2009', '9300', '240000'], ['Volkswagen', 'Golf VI STYLE', '2011', '9700', '203000'], ['Mazda', '6', '2006', '5600', '218000'], ['Hyundai', 'Tucson LOUNGE 2009', '2008', '8899', '149000'], ['BMW', '520', '2013', '21700', '146000'], ['Toyota', 'Highlander', '2015', '28000', '120000'], ['Mercedes-Benz', 'E 220', '2005', '8200', '276000'], ['BMW', '328', '2012', '12500', '260000'], ['Opel', 'Astra J', '2013', '9500', '224000'], ['Volkswagen', 'Passat B7', '2013', '11750', '138000'], ['Audi', 'A6 Quattro', '2006', '8000', '28000'] ] 
columns = ['Марка', 'Модель', 'Год', 'Цена', 'Пробег'] 

Таблица с одинаковой шириной колонок

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

# расчёт максимальной длинны колонок max_columns = [] # список максимальной длинны колонок for col in zip(*data): len_el = [] [len_el.append(len(el)) for el in col] max_columns.append(max(len_el)) 
# печать таблицы с колонками максимальной длинны строки # печать шапки таблицы for column in columns: print(f'>', end='') print() # печать разделителя шапки print(f'') # печать тела таблицы for el in data: for col in el: print(f'>', end='') print() 

Здесь в 4 строке кода, после : указана ширина колонок. Так как это не число, а выражение, его обрамляют фигурными скобками. Ширину колонок мы сделали по максимальной длине строки колонок и добавили еще один символ пустой строки » для отступов, end=» – указывает, что печать будет выводиться без переноса на новую строку. Выравнивание текста в строке по умалчиванию делается по левому краю, поэтому его не указываем. Далее будут рассмотрены все виды выравнивания.

Как напечатать таблицу с помощью f-string 1

Недостатки такой таблицы:

  • большая ширина (подходит для таблиц с примерно одинаковой длинной строк колонок);
  • трудно вычислить длину разделителя шапки.

Таблица с разной шириной колонок

Рассмотрим другой пример. Выведем таблицу с колонками максимальной длины строки каждого столбца.

# вывод таблицы с колонками максимальной длинны строки каждого столбца # печать шапки таблицы for n, column in enumerate(columns): print(f'>', end='') print() # печать разделителя шапки '=' r = f'' print(r[:-1]) # печать тела таблицы for el in data: for n, col in enumerate(el): print(f'>', end='') # выравнвание по правому краю > print() 

Как напечатать таблицу с помощью f-string 2

Теперь таблица стала компактнее.

В этом примере названия колонок меньше или равны ширине самих колонок. А что, если они будут больше? Например, состоять из двух слов.

Таблица с шапкой из двух строк

Если ширина названия колонок больше ширины колонок тела таблицы, тогда запишем их в шапке таблицы в две строчки — вот так:

Как напечатать таблицу с помощью f-string 3

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

# пишем название колонок в две строчки columns = [['Марка', 'Модель', 'Год', 'Цена $', 'Пробег км'], ['автомобиля', '', 'выпуска', '', '']] # вычислить максимальную длинну колонки шапки таблицы max_columns_title = [] # список максимальной ширины колонок шапки for col in zip(*columns): max_columns_title.append(max([len(el) for el in col])) max_col_title = max(max_columns_title) # максимальная ширина колонки шапки for col in columns: #width = [] for n, c in enumerate(col): # сравниваем максимальную колонку шапки с макс колонкой таблицы if max_columns[n] >= max_columns_title[n]: w = max_columns[n] + 2 width.append(w) else: w = max_columns_title[n] + 2 width.append(w) # пишем название колонок в две строчки print(f'>', end='') print() # печать разделителя шапки '=' print(f"") # печать тела таблицы for el in data: for n, col in enumerate(el): print(f'>', end='') print() print() 

Как напечатать таблицу с помощью f-string 4

Функция с параметром максимальной ширины таблицы

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

Как напечатать таблицу с помощью f-string 5

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

def print_table(data, columns, indent, max_width=100): # data — список списков, данные таблицы # columns — список списков, названия колонок таблицы # indent — отступ от края колонки # max_widt — допустимая ширина таблицы # max_columns — список максимальной длинны строки колонок # max_columns_title — список максимальной ширины колонок шапки # width — список ширины каждой колонки таблицы для печати # расчёт макимальной ширины колонок таблицы max_columns = [] for col in zip(*data): len_el = [] [len_el.append(len(el)) for el in col] max_columns.append(max(len_el)) # вычислить максимальную длинну колонки шапки таблицы max_columns_title = [] for col in zip(*columns): max_columns_title.append(max([len(el) for el in col])) # печать таблицы for col in columns: width = [] for n, c in enumerate(col): # сравниваем максимальную колонку шапки с макс колонкой таблицы if max_columns[n] >= max_columns_title[n]: w = max_columns[n] + indent width.append(w) else: w = max_columns_title[n] + indent width.append(w) # пишем название колонок в две строки if sum(width) >', end='') # выравниване по ценру else: print('Ширина таблицы больше допустимого значения') return print() # печать разделителя шапки '=' print(f"") # печать тела таблицы for el in data: for n, col in enumerate(el): if n < 3: print(f'>', end='') # выравнвание по правому краю else: print(f'', end='') # выравнвание по правому краю наследуется, с разделителем тысяч «,» print() 

Здесь, в 52 строке кода, в f’,> ‘ перед закрывающей фигурной скобкой вставлена запятая, как разделитель тысяч (кроме «,» можно ещё использовать «_»), ну а дальше форматирование сделает всё само:

Как напечатать таблицу с помощью f-string 6

Но это ещё не все возможности «спецификации формата».

Примечание: в F-string в фигурных скобках <> помещены «заменяющие поля». Двоеточие : указывает на поле format_spec , что означает нестандартный формат замены. Для него существует Мини-язык спецификации формата.

Функция для записи таблицы в текстовый файл

Часто приходится не только печатать таблицу, но и сохранять её в текстовом файле. Имея готовую функцию для печати, нетрудно переделать её для записи.

def write_table(file_name, data, columns, indent, max_width=100): # file_name — название текстового файла # data — список списков, данные таблицы # columns — список списков, названия колонок таблицы # indent — отступ от края колонки # max_widt — допустимая ширина таблицы # max_columns — список максимальной длинны строки колонок # max_columns_title — список максимальной ширины колонок шапки # width — список ширины каждой колонки таблицы для печати # расчёт макимальной ширины колонок таблицы max_columns = [] for col in zip(*data): len_el = [] [len_el.append(len(el)) for el in col] max_columns.append(max(len_el)) # вычислить максимальную длинну колонки шапки таблицы max_columns_title = [] for col in zip(*columns): max_columns_title.append(max([len(el) for el in col])) # запись таблицы with open(file_name, 'w', encoding='utf-8') as f: for col in columns: width = [] for n, c in enumerate(col): # сравниваем максимальную колонку шапки с макс колонкой таблицы if max_columns[n] >= max_columns_title[n]: w = max_columns[n] + indent width.append(w) else: w = max_columns_title[n] + indent width.append(w) # пишем название колонок в две строки if sum(width) >') else: print('Ширина таблицы больше допустимого значения') return f.write('\n') 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *