#python #sqlalchemy
#python #sqlalchemy
Вопрос:
Мне нужна помощь с форматом вывода в приведенном ниже коде:
p = select([persons])
st = select([persons,students]).where(students.c.id == persons.c.id)
t = select([persons,teachers]).where(persons.c.id == teachers.c.person_id)
cl = select([classes])
s_in_cl = select([students_in_class])
p1 = conn.execute(p)
st1 = conn.execute(st)
t1 = conn.execute(t)
cl1 = conn.execute(cl)
ss1 = conn.execute(s_in_cl)
print('nTable "persons" : n')
q1 = p1.fetchall()
if len(q1) < 1 : print('tTable "persons" is empty!n')
else :
for row in q1 : print(f't{row}')
print('nTable "students" : n')
q2 = st1.fetchall()
if len(q2) < 1 : print('tTable "students" is empty!n')
else :
for row in q2 : print(f't{row}')
print('nTable "teachers" : n')
q3 = t1.fetchall()
if len(q3) < 1 : print('tTable "teachers" is empty!n')
else :
for row in q3 : print(f't{row}')
print('nTable "classes" : n')
q4 = cl1.fetchall()
if len(q4) < 1 : print('tTable "classes" is empty!n')
else :
for row in q4 : print(f't{row}')
print('nTable "students_in_class" : n')
q5 = ss1.fetchall()
if len(q5) < 1 : print('tTable "students_in_class" is empty!n')
else :
for row in q5 : print(f't{row}')
Текущий вывод :
Таблица «лица» :
(2, 'Rajiv', 'Khanna', None, None)
(3, 'Komal', 'Bhandari', None, None)
(4, 'Michael', 'Ross', 'mikey4@gmail.com', datetime.datetime(2006, 10, 12, 0, 0))
(5, 'Ann', 'Ross', 'ann_qw@gmail.com', datetime.datetime(2021, 11, 25, 0, 0))
Таблица «студенты» :
(4, 'Michael', 'Ross', 'mikey4@gmail.com', datetime.datetime(2006, 10, 12, 0, 0), 1, 4)
Таблица «учителя» :
(3, 'Komal', 'Bhandari', None, None, 1, 3)
Таблица «классы» :
(1, 'philosophy', 'group_1', 1)
Таблица «students_in_class» :
Table "students_in_class" is empty!
Я хочу видеть его в форме PrettyTable, как я могу добавить к нему заголовки (имена столбцов) и правильно отформатировать строки (строки таблицы)?
Любая помощь будет оценена 😉
Комментарии:
1. что вы пробовали? может быть, просто использовать
print("text with headers")
для просмотра заголовков? И если вы хотите лучше отформатировать, тогда, возможно, используйте более сложную f-строку, т.е.f"{row[0]} | {row[1]} | ..."
И если вы хотите видеть в формеPrettyTable
, то, возможно, вам следует проверить документацию для PrettyTable и использовать этот модуль. Для создания с нуля сначала потребуется получить длины для всех значений, а затем распечатать таблицу, используя дополнительные значения в f-string — т.е.f"{row[0]:10}
Для создания текста длиной 10 символов.2. пожалуйста, не ставьте код после
:
— это делает код нечитаемым. Поместите код в следующую строку.
Ответ №1:
Если вы хотите использовать PrettyTable
, то у вас есть все в документации
Сначала создайте PrettyTable()
и затем назначьте список с именами столбцов table.field_names
, затем добавьте все строки в таблицу и, наконец print()
, ее.
import datetime
q1 = [
(2, 'Rajiv', 'Khanna', None, None),
(3, 'Komal', 'Bhandari', None, None),
(4, 'Michael', 'Ross', 'mikey4@gmail.com', datetime.datetime(2006, 10, 12, 0, 0)),
(5, 'Ann', 'Ross', 'ann_qw@gmail.com', datetime.datetime(2021, 11, 25, 0, 0)),
]
from prettytable import PrettyTable
table = PrettyTable()
table.field_names = ["A", "B", "C", "D", "E"]
table.add_rows(q1)
print(table)
Дает
--- --------- ---------- ------------------ ---------------------
| A | B | C | D | E |
--- --------- ---------- ------------------ ---------------------
| 2 | Rajiv | Khanna | None | None |
| 3 | Komal | Bhandari | None | None |
| 4 | Michael | Ross | mikey4@gmail.com | 2006-10-12 00:00:00 |
| 5 | Ann | Ross | ann_qw@gmail.com | 2021-11-25 00:00:00 |
--- --------- ---------- ------------------ ---------------------
Если вы хотите сделать то же самое без PrettyTable
, то это потребует много работы, потому что сначала вы должны получить максимальную длину в каждом столбце, а позже вы можете использовать ее f-string
для установки длины строки в столбце — ie.
f"{row[0]:{lenght_row_0}} | {row[1]:{lenght_row_1}} | ... "
Пример
import datetime
q1 = [
(2, 'Rajiv', 'Khanna', None, None),
(3, 'Komal', 'Bhandari', None, None),
(4, 'Michael', 'Ross', 'mikey4@gmail.com', datetime.datetime(2006, 10, 12, 0, 0)),
(5, 'Ann', 'Ross', 'ann_qw@gmail.com', datetime.datetime(2021, 11, 25, 0, 0)),
]
# --- add headers ---
q1.insert(0, ["A", "B", "C", "D", "E"])
# --- lengths ---
columns_lengths = [0 for _ in range(len(q1[0]))]
for row in q1:
for number, item in enumerate(row):
length = len(str(item))
if length > columns_lengths[number]:
columns_lengths[number] = length
# --- horizontal line ---
items = []
for number, item in enumerate(row):
length = columns_lengths[number]
items.append(f'{"-"*(length 2)}')
horizontal_line = " " " ".join(items) " "
# --- table ---
# - line -
print(horizontal_line)
# - header -
items = []
for number, item in enumerate(q1[0]):
length = columns_lengths[number]
items.append(f'{str(item):^{length}}')
print("|", " | ".join(items), "|")
# - line -
print(horizontal_line)
# - rows -
for row in q1[1:]:
items = []
for number, item in enumerate(row):
length = columns_lengths[number]
items.append(f'{str(item):^{length}}')
print("|", " | ".join(items), "|")
# - line -
print(horizontal_line)
Результат:
--- --------- ---------- ------------------ ---------------------
| A | B | C | D | E |
--- --------- ---------- ------------------ ---------------------
| 2 | Rajiv | Khanna | None | None |
| 3 | Komal | Bhandari | None | None |
| 4 | Michael | Ross | mikey4@gmail.com | 2006-10-12 00:00:00 |
| 5 | Ann | Ross | ann_qw@gmail.com | 2021-11-25 00:00:00 |
--- --------- ---------- ------------------ ---------------------