| Форматирование информации |
|
Следующий этап на пути передачи информации в руки тех, кому она необходима, заключается в форматировании данных так, чтобы их легко можно было воспринимать и понимать. Мы считаем, что информация должна быть представлена в том виде, в каком, по крайней мере, ее легко будет воспринимать, но еще лучше, если оформление будет еще и привлекательным. С технической точки зрения применение форматов ReST и Textile охватывает сразу оба этапа - сбора и форматирования информации, но в следующих примерах мы сосредоточимся исключительно на преобразовании уже собранных данных в более представительный вид. Графические изображения В следующих двух примерах мы продолжим пример анализа файла журнала веб-сервера Apache, из которого извлекаются IP-адреса клиентов и количество переданных байтов. В предыдущем разделе, продолжая этот пример, мы создали промежуточный файл, содержащий информацию, которой мы предполагаем поделиться с другими. Поэтому на основе этого промежуточного файла мы создадим диаграмму, чтобы эти данные было проще воспринимать:
В этом примере были импортированы два модуля, gdchart и shelve. Затем был открыт файл хранилища объектов, созданный в предыдущем примере. Объект shelve обладает тем же интерфейсом, что и встроен- ный тип dictionary, поэтому имеется возможность вызвать его метод items(). Этот метод возвращает список кортежей, где первый элемент кортежа соответствует ключу словаря, а второй элемент - значению этого ключа. Применение метода iterns() обеспечивает возможность сортировки данных, что определенно будет иметь смысл, когда мы начнем рисовать диаграмму. Кроме того, с помощью генератора списков мы меняем порядок следования элементов в кортежах. То есть вместо кортежей с элементами (ip_address, bytes_sent) мы получаем кортежи (bytes_sent, ip_address). Затем выполняется сортировка кортежей в списке, а поскольку в каждом кортеже первым элементом является значение bytes_sent, метод list. sort() выполнит сортировку по этому элементу. Далее с помощью генератора списков извлекаются значения bytes_sent и ip_address. Обратите внимание, что мы прибегли к сокрытию IP-адресов, заменив их значением XXX. XXX. XXX. XXX, потому что данные для этого примера были получены нами из файла журнала действующего веб-сервера. После выборки данных, на основе которых будет построена диаграмма, можно приступать к созданию ее графического представления, используя модуль gdchart. Сначала создается объект gdchart. Bar. Это простой объект диаграммы, в котором необходимо установить значения некоторых атрибутов, а затем с его помощью можно будет отобразить диаграмму в файл PNG. После этого определяются размеры диаграммы в пикселях, цвет фона и цвет переднего плана и создаются заголовки. Устанавливаются данные и метки для диаграммы, полученные в результате анализа файла журнала веб-сервера Apache. В заключение вызывается метод draw(), который выводит диаграмму в файл, и производится закрытие файла хранилища. Изображение полученной диаграммы показано на рис. 4.1. Ниже приводится другой пример сценария, выполняющего визуализацию данных, находящихся в файле хранилища, но на этот раз программа создает не гистограмму, а круговую диаграмму:
Рис. 4.1. Гистограмма количества байтов, переданных по запросам с каждого IP-адреса
Принцип действия этого сценария практически идентичен предыдущему за несколькими исключениями. Во-первых, в этом сценарии создается экземпляр объекта gdchart. Pie, а не gdchart. Bar. Во-вторых, мы определили отдельные цвета для каждого сектора диаграммы. Это круговая диаграмма и поэтому, если все сектора вывести черным цветом, такую диаграмму будет невозможно читать, в связи с чем нами было принято решение организовать чередование трех градаций серого цвета. Чередование этих трех цветов было реализовано с помощью функции cycle() из модуля itertools. Мы рекомендуем вам обратить свое внимание на модуль itertools. В нем имеется значительное число интересных функций, которые помогут вам в работе с итерируемыми объектами (такими, как списки). Результат работы этого сценария, создающего круговую диаграмму, приводится на рис. 4.2. Единственный недостаток круговой диаграммы состоит в том, что произошло наложение (сокрытие) IP-адресов, соответствующих секторам с минимальными значениями переданных байтов. Гистограммы и круговые диаграммы существенно облегчают восприятие данных, находящихся в файле хранилища, процесс создания диаграмм оказался на удивление простым, и включение данных было удивительно легким делом.
Рис. 4.2. Круговая диаграмма с количеством байтов, переданных по запросам с каждого IP-адреса Другой способ представления информации из файлов с данными заключается в сохранении их в формате PDF. Формат PDF приобрел господствующее положение, и мы готовы предполагать, что все документы можно преобразовать в PDF. Знание и умение создавать документы в формате PDF может существенно облегчить жизнь вам как системным администраторам. После прочтения этого раздела вы сможете применять полученные знания для создания отчетов в формате PDF о загруженности сети, об учетных записях пользователей и так далее. Мы также опишем способ автоматического встраивания документов PDF в сообщения электронной почты с использованием языка Python. Библиотеку ReportLab в мире библиотек, предназначенных для работы с форматом PDF, можно сравнить с 350-килограммовой гориллой. В документе, расположенном по адресу http://www.reportlab.com/ docs/userguide.pdf, вы найдете значительное число примеров использования библиотеки ReportLab. Кроме этого раздела мы настоятельно рекомендуем вам ознакомиться с официальной документацией проекта ReportLab. Для установки библиотеки ReportLab в Ubuntu достаточно дать команду apt-get install python-reportlab. Если вы пользуетесь другим дистрибутивом, воспользуйтесь помощью менеджера пакетов в своей операционной системе. Иначе у вас всегда есть возможность получить дистрибутив с исходными текстами. В примере 4.3 приводится пример использования библиотеки Report-Lab для создания простого документа PDF «Hello World».
Нам хотелось бы сделать несколько замечаний к процессу создания PDF-документа «Hello World». Во-первых, сначала был создан объект canvas. Далее был использован метод drawString(), который можно считать эквивалентом метода file_obj.write() в случае текстовых файлов. В заключение были вызваны метод showPage(), завершающий процесс рисования, и метод save(), который фактически создает файл PDF. Если выполнить этот сценарий, в результате будет получен пустой одно-страничный документ PDF с надписью «Hello World» в самом низу. Если вы загрузили дистрибутив с исходными текстами библиотеки ReportLab, вы можете воспользоваться тестами, которые были включены как примеры оформления документации. То есть при запуске эти тесты создают комплект файлов PDF, которые можно изучить и посмотреть, как с помощью библиотеки ReportLab можно добиться различных визуальных эффектов. Теперь, когда вы увидели, как с помощью библиотеки ReportLab создаются документы PDF, посмотрим, как с ее же помощью создать отчет об использовании дискового пространства. Такой отчет может оказаться весьма полезным. Взгляните на пример 4.4. Пример 4.4. Отчет об использовании дискового пространства
Этот сценарий генерирует отчет с заголовком «Disk Capacity Report» (Отчет об использовании дискового пространства), отображающий текущую информацию об использовании дискового пространства, а также указывается дата и время создания отчета. Для сценария такого незначительного размера это очень неплохо. Рассмотрим некоторые особенности этого примера. Во-первых, функция disk_report() просто принимает вывод команды df -h и возвращает его в виде списка строк. Далее, в функции create_pdf() сначала создается надпись с текущей датой и временем. Самая важная часть этого примера — объект textobject. Объект textobject создается, чтобы потом поместить его в документ PDF. Создание объекта textobject производится с помощью метода beginText(). Затем определяется способ размещения данных на странице. Наш документ будет содержать страницы размером 8.5x11 дюймов, поэтому, чтобы поместить текст в самом верху страницы, мы сообщаем текстовому объекту, что текст будет находиться в 11 дюймах от начала координат. После этого создается заголовок выводом строки в текстовый объект, и мы завершаем работу, выполняя обход списка строк, полученных в результате работы команды df. Обратите внимание: здесь использован метод line. strip() для удаления символов новой строки. Если этого не сделать, символы новой строки будут присутствовать в документе в виде черных квадратов. Имеется возможность создавать намного более сложные документы PDF, добавляя цвета и изображения, но обо всем этом вы сможете узнать во время чтения превосходного руководства пользователя, поставляемого вместе с библиотекой ReportLib. Главное, что следует из этих примеров, текст является основным объектом, хранящим данные, которые требуется отобразить.
Set as favorite
Bookmark
Email This
Hits: 248 Комментарии (0)RSS feed CommentsНаписать комментарий |