Загрузка данных в вычислительной среде на базе Python

 

Загрузка данных в компьютерную среду для их последующего анализа представляет один из необходимых этапов. Набор включенных в стандартный дистрибутив Python библиотек, а также  сторонние средства, ориентированные на решение прикладных научных задач (такие как Scipy, Pandas и др.) позволяют решить эту задачу весьма эффективно. Здесь мы рассмотрим несколько примеров импорта данных в вычислительную среду на базе Python при помощи как стандартных библиотек, так и с использованием современных библиотек научных вычислений.

Прежде чем рассматривать конкретные примеры загрузки данных при помощи тех или иных библиотек,  определимся с тем, что будет являться источником данных. В большинстве случаев  источником данных является регулярный файл (независимо от используемой операционной системы), например, файл с таблицей Excel, или просто текстовой файл.  Источником данных может быть таблица в фрагменте html-документа, возвращаемая web-сервером при обращении к определенному url-адресу. И, наконец, данные могут передаваться в виде потока, например, данные с логгеров параметров окружающей среды (температура, влажность, атмосферное давление и пр.) или видеопоток.

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

Регулярный файл

xls-документ (документ MS Excel).

В случае xls-документа загрузка  выбранной таблицы в рабочую машинную среду на базе Python может осуществляться либо с привлечением сторонней библиотеки для работы с xls-документами, либо при помощи предварительного конвертирования xls-таблицы в csv (comma separated values - значения разделенные запятыми) формат. Последний является обычным текстовым форматом. Таким образом, если необходимо загрузить данные из xls-документа не прибегая к сторонним библиотекам, а используя лишь встроенный (то, что называется battaries included) функционал Python, самый оптимальный вариант состоит в предварительной конвертации xls-документа в csv-формат. Для работы с csv-файлами в Python есть модуль csv.  В случае, если никаких ограничений не накладывается, то можно рекомендовать библиотеку xlrd,  специально предназначенную для загрузки данных из документов MS Excel.

#Загрузка файла csv-файла
import csv
with open('1.csv','r') as f:
  mycsv = csv.reader(f)
  for row in mycsv:
    print row 

Представленный фрагмент кода последовательно загружает в виде списка строки из csv-файла и выводит их на экран. По умолчанию в библиотеке csv в качестве разделителя значений используется символ запятой (","), поэтому при конвертировании xls-файла в csv-формат необходимо проследить, чтобы полученный файл удовлетворял этому требованию, либо указать тип используемого разделителя вручную (для этого используются дополнительные параметры функции reader: delimiter=';').

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

 

#-*- coding: utf8 -*-
import xlrd

#Открыть рабочую книгу xls с помощью пакета xlrd
mybook = xlrd.open_workbook('1.xls')

#Вывести в виде списка все листы xls-книги
print 'Листы рабочей книги:', mybook.sheet_names()

#Выбор текущего листа из книги
mysheet = mybook.sheet_by_name('1')

print 'Количество строк в листе 1:', mysheet.nrows
print 'Количество колонок в листе 1:', mysheet.ncols

#Читаем строки листа 1 текущей книги по одной...
for item in xrange(mysheet.nrows):
  print 'Строка #%s:%s'%(item,mysheet.row(item))

Процесс загрузки данных с помощью пакета xlrd весьма непрост если сравнивать с приведенным выше примером загрузки csv-файла. Специально созданный пакет для работы с данными pandas решает задачу загрузки из xls-документов более эффективно:

 

import pandas as pd

mydata = pd.io.excel.read_excel(open('1.xls'), sheetname=0)

print mydata

При использовании pandas для загрузки данных из страницы MS Excel создается объект класса DataFrame (аналог DataFrame из среды статистического анализа R), содержащий загруженные данные. Следует отметить, что функция read_excel автоматически назначает имена строкам, а в качестве имен колонок для создаваемого DataFrame объекта по-умолчанию будут использованы значения первой строки. Поэтому если планируется загружать данные при помощи pandas желательно обеспечить колонки именами.

Объекты класса DataFrame имеют огромное количество вспомогательных функций (более точно – методов), позволяющих осуществлять удобное конвертирование данных. Например, чтобы представить загруженные данные в виде Python словаря, достаточно в рассмотренном примере вызвать метод to_dict: mydata.to_dict().  Вообще, пакет pandas предлагает очень богатый и удобный инструментарий для загрузки, обработки и конвертирования данных в различные форматы.

Загрузка данных по http

Нередки случаи, когда необходимо провести загрузку данных, находящихся на какой-либо web-странице. В этом случае необходимо загрузить содержимое этой web-страницы, найти среди html-кода его фрагмент, содержащий интересующие данные и извлечь их. Для решения этой задачи (в ее простых случаях, например, когда на одной web-странице находится одна таблица) очень удобен инструмент, предоставляемый пакетом Pandas. Функция read_html пакета Pandas позволяет осуществить загрузку таблицы из html документа и создать соответствующий загруженным данным объект класса DataFrame.  Важно отметить, что парсинг полученного по url html-документа осуществляется в этом случае сторонней библиотекой (по-умолчанию используется lxml). lxml достаточно сложная в установке библиотека, поскольку фактически она представляет собой Python-интерфейс для "низкоуровневых" библиотек (libxml, libxlst), написанных на С (установка последних, например, на Windows, может вызвать определенные трудности). В связи с этим, рекомендуемым пакетом (независимой от используемой ОС) для парсинга html документов является связка BeautifulSoup и html5lib. Они обе написаны на "чистом" Python-e; таким образом гарантируется их благополучная работа независимо от используемой операционной системы.

 

#-*- coding: utf8 -*-
import pandas as pd
import urllib

myurl = urllib.urlopen('https://ru.wikipedia.org/wiki/%D0%98%D1%80%D0%B8%D1%81%D1%8B_%D0%A4%D0%B8%D1%88%D0%B5%D1%80%D0%B0')
irises = pd.read_html(myurl,flavor='bs4')
print irises
blog comments powered by Disqus