Python в ИБ. Часть 8. Парсинг и обработка данных
Сегодня речь пройдёт про парсинг и обработку данных. Практически любой программист или хакер сталкивается с этой проблемой и так или иначе решает её. Отдельно хочется отметить, что люди разрабатывающие парсеры обычно без денег не бывают. Конечно, там уровень гораздо выше, но общий смысл тот-же.
Мы не будем касаться специальных библиотек и фреймворков, просто рассмотрим основы обработки текста.
Теория.
Парсинг – обработка данных (зачастую текстовых) с цель получения необходимой информации и представление её в удобоваримом виде. Данное определение довольно ёмко описывает парсинг, но вы можете найти и другие.
Зачастую, когда говорят про парсинг, чаще всего упоминают сайты и парсинг сайтов. Это достаточно широкая тема. Парсинг сайтов – очень полезен во многих бизнес-сферах и других задачах. Получение необходимой информации с различных сайтов может строить целые сферы деятельности.
Но мы не будем углублять в парсинг сайтов, думаю, материалов по этой теме можно найти достаточно и самостоятельно их освоить. В данном уроке мы коснёмся совсем основ и распарсим небольшие примеры.
Ничего устанавливать из библиотек не потребуется, мы будем работать со стандартными модулями.
Начнём с простого примера.
Допустим у нас есть некоторый текстовый файл в котором на каждой строке есть запись вида “<Имя> <Фамилия> <Возраст>”. Это может быть список чего угодно. Сделаем небольшой такой файл.
Значений может быть больше, сейчас это не так важно.
Теперь представим следующую задачу: Нам нужно принимать данный список (например скачивать его с какой-нибудь общей файловой папки) и заносить в какую либо базу данных, однако напрямую это сделать нельзя, так как запрос нужно построить по особо типу, и руками сделать это практически невозможно (допустим файл будет содержать 10000+ строк). Для этого нам потребуется небольшой скрипт, который автоматизирует обработку и составит запрос. Для начала давайте прочтём файл и сохраним всё в один большой буфер.
Запустим и проверим работу скрипта.
Отлично, теперь давайте из общего буфера сделаем список, в котором каждый элемент будет является одной строчкой из файла. Это легко делается с помощью метода split, который производит разбиение строки по указанному разделителя (в нашем случае разделителем является символ перевода строки).
Изменим только последнюю часть кода и посмотрим на результат его работы.
Отлично, теперь у нас есть список из строк. Теперь давайте создадим класс, который будет представлять собой отдельного пользователя, его можно будет расширить, когда у нас в базе данных появятся новые поля и прочее.
Класс в своём конструкторе принимает буфер, который разбивается по символу пробела. По сути конструктор принимает строку, которая отвечает за описание пользователя, эта строка разбивается и каждое из значений записывается в одно из свойств класса.
Создадим список из объектов данного класса. После вызовем метод show у каждого из них.
Посмотрим на результат работы.
Отлично, всё работает. Дальше можно сделать специальный метод, который формирует запрос в базу данных с данными текущего пользователя и прочее. Но это уже выходит за тему данного урока.
Перед тем как мы начнём рассмотрение следующего мощного инструмента для обработки текста, хотелось бы сказать про одну небольшую, но крайне полезную в ряде случае функцию (точнее метод). Это метод strip. Работает он таким образом.
Крайне удобная функцию для удаления символов перевода строки и лишних пробелов.
Теперь кратко рассмотрим достаточно мощный инструмент для поиска в тексте и обработки данных. Это регулярные выражения, наверняка, вы про них что-то слышали.
Регулярные выражения представляют собой некоторые шаблоны, описываемые по специальным правилам, которым может удовлетворять текст. Например, чтобы найти в тексте слова определённый длины можно использовать регулярные выражения, или чтобы найти слова содержащие определённые символы, тоже можно использовать регулярные выражения.
Регулярные выражения большая тема, по которой есть книжки и курсы, мы рассмотрим лишь небольшую часть.
Итак, представим, что у нас есть куча текста из которого нам нужно найти только небольшой фрагмент, при этом мы точно не знаем, какое значение у этого фрагмента, но знаем, что оно подчиняется некоторым правилам (допустим мы ищем число с плавающей точкой, которое может изменяться – это может быть что угодно, от температуры до стоимость услуги или товара).
Пусть у нас есть вот такой текстовый файл с кучей бессмысленных данных (не особо правдоподобно, но всё же) и нам надо найти в нём число с плавающей точкой, при этом мы знаем, что количество знаком перед запятой равно 3, а после запятой равно двум.
С помощью данного скрипта можно решить данную задачу.
Давайте разберём строчку 18, так как остальное не вызывает интереса. Для начала обратим внимание, на то что используется модуль re, это библиотека содержащая в себе функции, работающие с регулярными выражениями.
Функция findall находит все вхождения подчиняющиеся регулярному выражению, указанному в качестве первого аргумента, в тексте, который находится во втором аргументе.
Теперь разберём само регулярное выражение и разберёмся, почему оно так выглядит.
- \d – обозначает, что на данном месте должна быть цифра (0-9)
- {3} – фигурные скобки указывают на длину предшествующего им идентификатора, в данном случае указывается, что должно быть 3 цифры, то есть трёхзначное число.
- \. – здесь непосредственно задаётся символ точки, косая черта нужна для того, чтобы символ точки был обработан именно как символ точки, так-как в регулярных выражениях точка обозначает любой символ. Косая черта позволяет указать, чтобы следующий за ней символ обрабатывался именно как символ, а не как особая последовательность.
Теперь, когда мы всё разобрали, давайте запустим и посмотрим на результат работы.
Отлично, мы нашил число.
Регулярные выражения очень мощный инструмент, особенно при обработке большого объёма данных. Если вы сталкиваетесь с этой проблемой часто, рекомендуем изучить тему регулярных выражений подробнее.
Вот урок и подходит к концу, надеюсь вам было полезно узнать про базовые методы обработки данных. Отныне, если вам надо будет как-то преобразовать текст, вы можете пользоваться ими и автоматизировать этот непростой процесс.
Как насчет потоковой обработки? Ведь файл может быть мега большим и нужно обеспечить обработку данных по порциям.