Инструменты Python. Создание нестандартных отчетов

Инструменты Python. Создание нестандартных отчетов

Для примера представим задачу:

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

Имеем:

  • папку, в которой располагаются необходимые изображения;
  • excel-файл, в котором представлены идентификаторы изображений с пояснениями.
Инструменты Python. Создание нестандартных отчетов

Начнем с создания ipynb-файла в том же месте, где располагается папка с изображениями и Excel-файл. Для работы нам понадобятся только 2 библиотеки:

import pandas as pd import os

Загрузим информацию с Excel-файла, а также имена файлов, которые располагаются в папке «Изображения»:

df = pd.read_excel('Пояснения.xlsx', encoding='utf8') list_img = os.listdir('Изображения/')
Инструменты Python. Создание нестандартных отчетов

Далее необходимо реализовать функцию, которая сформирует отчет в виде таблицы в.html-файле. Функция будет состоять из 3-х функциональных частей:

  • начало: задаем заголовок и имена столбцов;
  • тело документа: отображение изображений с пояснениями;
  • конец: запись данных, формирование документа.
with open('Report.html', 'w') as f: html_tags = \ """ <!doctype html> <html> <head></head> <body> <h1>Отчет с изображениями и пояснениями</h1> <style> table {border-collapse: collapse;} td, th {border: 5px solid #000; text-align: "center"; padding: 8px; font-size:24pt} </style> <table style='width:100%'; border='5'> <tr> <th>Изображение</th> <th>Пояснения</th> </tr> """ f.write(html_tags)

С помощью данной конструкции создается html-файл с названием Report.html. Между тегами «h1» задается заголовок отчета. Между тегами «style» задаются параметры для форматирования таблицы и текста. Например, параметр «font-size» задает размер текста. Далее с помощью тегов «th» задаем количество и имена столбцов.

data = '' for img in list_img: path_to_img = 'Изображения/' + img description = str(df[df['Изображение'] == img.strip('.png')]['Пояснения'].values[0]) data += '<tr>' data += '<td align="center"><img src={0} width=600></td>'.format(path_to_img) data += '<td align="center">{0}</td>'.format(description) data += '<tr>'

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

  • path_to_img: путь к изображению;
  • description: описание к изображению.
with open('Report.html', 'a') as f: f.write(data) html_tags = """ </table> </body> </html> """ f.write(html_tags)

Последний блок функции записывает в.html-файл информацию о расположении изображения, а также его описание. Структура.html-файлов формируется за счет тегов (html, head, h1, body и т.д.), которые всегда записываются два раза, для каждого из значений или параметров. Для корректного вывода текст заголовка нужно поместить между тегами «h1» (открытие тега) и «/h1» (закрытие тега). Т.к. в первом блоке функции сформировали документ открытием тегов (html, body, table) в конце документа, то после записи информации необходимо закрыть указанные теги с помощью записи переменной html_tags.

Инструменты Python. Создание нестандартных отчетов

После запуска функции, в папке где располагается ipynb-файл сформируется отчет с именем Report.html. Для его запуска можно воспользоваться любым интернет-браузером. Для корректной работы необходимо, чтобы папка с изображениями, excel-файл, ipynb-файл и Report.html располагались в одной директории.

11
реклама
разместить
1 комментарий

...
description = str(df[df['Изображение'] == img.strip('.png')]['Пояснения'].values[0])
...
C:\...\Python38-32\lib\site-packages\pandas\core\ops\array_ops.py:253: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
res_values = method(rvalues)
Traceback (most recent call last):
File "...Ot4et.py", line 39, in
description = str(df[df['Изображение'] == img.strip('.png')]['Пояснения'].values[0])
IndexError: index 0 is out of bounds for axis 0 with size 0

В чем ошибка подскажите?