Добавление в таблицу всех строк из вывода 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 шт):
Предположим, что мы работаем с такой таблицей 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