Добавление в таблицу всех строк из вывода python

Пытаюсь делать выборку по файлу excel

wb = openpyxl.load_workbook(file, read_only=True)
ws = wb.active

mytable = PrettyTable(['None'])

for row in ws.iter_rows():
    for cell in row:
        if cell.value == "x":
            value = ws.cell(row=cell.row, column=1).value
            value2 = ws.cell(row=cell.row, column=2).value
            if value2 == None:
                print(value)
            else:
                print(value, value2)

На вывод у меня выходит список значений:

Яблоко
Банан
Клубника

При внесении этих данных в prettytable, сохраняется только последнее значение из списка:

+----------+
|   None   |
+----------+
| Клубника |
+----------+

Как добавить все значения сразу?


Ответы (1 шт):

Автор решения: Vitalizzare

Предположим, что мы работаем с такой таблицей Excel (в столбце B - латинская "икс", не путать с русской "ха"):

A B
Яблоко x
Банан
Клубника x
Груша
Киви
Арбуз x
Абрикос x
Вишня

Задачу конкретизируем таким образом: прочитать столбцы A и B из Excel в PrettyTable и вывести на печать те значения A, для которых B равно 'x'.

Для работы с Excel используем openpyxl:

import openpyxl
from prettytable import PrettyTable

wb = openpyxl.open('path/to/the/excel/file.xlsx')
ws = wb.active    # предполагаем, что страница одна
table = PrettyTable()

К нужным столбцам обращаемся по имени, извлеченные значения добавляем в PrettyTable методом add_column:

for col in 'AB':
    table.add_column(col, [cell.value for cell in ws[col]])

Если первая ячейка столбца - его имя, тогда:

for col in 'AB':
    header, *data = [cell.value for cell in ws[col]]
    table.add_column(header, data)

Посмотрим содержимое table (чтобы в пустых ячейках не печатать None, передаём свойству PrettyTable.none_format непустую строку для замены):

table.none_format = ' '    # заменить None на пробел
print(table)

# +----------+---+
# |    A     | B |
# +----------+---+
# |  Яблоко  | x |
# |  Банан   |   |
# | Клубника | x |
# |  Груша   |   |
# |   Киви   |   |
# |  Арбуз   | x |
# | Абрикос  | x |
# |  Вишня   |   |
# +----------+---+

Чтобы вывести на печать только A и те строки, в которых B равно 'x', используем свойства fields для отбора столбцов и row_filter для фильтрации строк. Первое должно быть индексируемым объектом, содержащим имена нужных колонок. Второе должно быть функцией, принимающей строку и возвращающей True для нужных строк и False для скрываемых.

table.row_filter = lambda row: row[1] == 'x'    # 1 = индекс столбца B
table.fields = ['A']
print(table)

# +----------+
# |    A     |
# +----------+
# |  Яблоко  |
# | Клубника |
# |  Арбуз   |
# | Абрикос  |
# +----------+

Как альтернатива, мы можем оставить эти свойства как есть, а передать одноименные аргументы методу get_string:

import openpyxl
from prettytable import PrettyTable


wb = openpyxl.open('path/to/the/excel/file.xlsx')
ws = wb.active    
table = PrettyTable()

for col in 'AB':
    table.add_column(col, [cell.value for cell in ws[col]])

print(table.get_string(
    row_filter = lambda row: row[1] == 'x',
    fields = ['A']
))

Примечание: В исходном вопросе не ясна структура данных и алгоритм работы. Ответ выше - вольная интерпретация предоставленной информации. Используется prettytable версии 3.16.0

→ Ссылка