Python - работа с Excel

Python — работа с Excel

Python — работа с Excel. Ввел я в Google что бы найти хоть что-то, что поможет решить мне задачу, суть которой сводится к получению всех номеров мобильных телефонов из некоторого количества файлов Excel. Конечно, можно было вспомнить Zennoposter, о котором писал ранее, и методику работы которого с Excel описывал тут, но раз я изучаю Python — то почему бы не реализовать задачу на Python?
Более конкретно задача выглядит следующим образом: имеется 23 экселевских файла, в которых имеются полные адреса и телефоны ВСЕХ 😉 аптек в Украине (не факт, что информация слишком уж актуальная, учитывая, что взяты эти файлы с государственного сайта Министерства здравоохранения — а ведь все знают, как работают госслужащие, правда? 🙂 ).
депутат работает
Как бы там не было — нужно сделать что-то, что позволит получить номера всех мобильных телефонов, имеющихся в данных файлах. Конечно, можно сделать это и в ручном режиме. Всего-то и дел — открыть файл, просмотреть, и выписать номера мобильных. А что, если все автоматизировать с учетом нашей темы: Python — работа с Excel? Начнем!

Для примера откроем файл с адресами и телефонами аптек, расположенных в Ивано-Франковской области. Сам файл для примера доступен по ссылке. Если вы откроете файл, то увидите, что все номера телефонов расположены в колонке D, и начинаются с номера 2 (поверьте, остальные файлы построены по такой же схеме):
Python - работа с Excel - пример файла

Т.е. нам нужно — открыть файл, и прочитать все номера телефонов, которые имеются в колонке D. Причем — если номер — мобильный — нужно сохранить его в файл (т.е. используем регулярные выражения). Кстати, было бы неплохо не вводить название обрабатываемого файла в ручном режиме (хорошо, когда файлов штук 30, а если их десять тысяч?) — а сделать цикл, который будет обрабатывать файлы в автоматизированном режиме: взял один файл — обработал, взял другой файл — обработал, и так до конца).

Прежде всего — подключаем необходимые для работы библиотеки:
import os #библиотека для работы с файлами и каталогами
import openpyxl #библиотека для обработки Excel-файлов
import re #библиотека для парсинга с помощью регулярных выражений

Теперь создаем переменную, отвечающую за путь к папке с файлами:
path = os.chdir(‘c:\\Users\\Oleksiy\\Desktop\\Полный список аптек в Украине\\’) #важно — слеши идут двойные, в формате, необходимом для Python, путь загнали в переменную

Теперь нам необходимо получить полный список файлов, находящихся в указанном каталоге:
list_directory = os.listdir(path) #т.е. переменная list_directory состоит из списка всех файлов, которые находятся в директории, находящейся в переменной path

А теперь переходим к коду — описывать его построчно смысла нет, потому читайте комментарии:
for i in list_directory:
    print(‘Начинаем обработку файла:’, i)
    wb = openpyxl.load_workbook(i)
    sheets = wb.get_sheet_names() # Получили полный список листов в файле и загнали в список
    sheet = wb.get_sheet_by_name(sheets[0])
    row_count = sheet.max_row # Определили количество строк
    column_count = sheet.max_column # Определили количество колонок

    print(‘В документе’, i, ‘\n — строк: ‘, row_count, ‘\n — колонок:’, column_count)
    print(‘\n’)

    number_row = 2 #Вводим переменную, отвечающую за начальный номер строки
    letter_colomn = ‘D’ #Вводим переменную, отвечающую за колонку

    while number_row < row_count:
        regxp = ‘((067|098|050|066|097|068|099|093|096)\d{7})’ #Регулярное выражение для поиска мобильных номеров
        number_row = str(number_row)
        row = letter_colomn + number_row #Создаем переменную ячейки, с которой будем работать
        row = str(row) #Конвертируем ее в строковую
        temp_number = sheet[row].value #В переменную загоняем значение ячейки
        temp_number = str(temp_number) #Конвертируем это значение в строковую

        temp_number = temp_number.replace(‘(‘, »).replace(‘)’, »).replace(‘ ‘, »).replace(‘-‘, »).replace(‘.’, »).replace(‘,’, ») #Обрезали все лишнее в номере — тире, точки, скобочки
        
result_number = re.findall(regxp, temp_number) #Начинаем парсить по номеру (напоминаю, номер уже окультурили)

        lens = len(result_number) #Вводим переменную, отвечающую за количество элементов после парсинга
        result_number = str(result_number)
        if lens == 1: #Если элемент один
            number_to_file = result_number[3:12] #Берем все цифры в указанном промежутке
            with open(‘number.txt’, ‘a’, encoding=’utf8′) as f: #Создаем файл — если его не было раньше — в режиме дозаписи
            f.write(number_to_file + ‘\n’) #Сохраняем в файл найденный и очищенный номер мобильного телефона
        elif lens == 2: #Если элементов два
        number_to_file = result_number[3:12] # Берем все цифры в указанном промежутке
            number_to_file2 = result_number[26:35] #Берем все цифры в указанном промежутке
            with open(‘number.txt’, ‘a’, encoding=’utf8′) as f: #Создаем файл — если его не было раньше — в режиме дозаписи
            f.write(number_to_file + ‘\n’ + number_to_file2 + ‘\n’) #Сохраняем в файл найденный и очищенный номер мобильного телефона

        number_row = int(number_row) #Конвертируем переменную в инт
        number_row = number_row + 1 #Увеличиваем на единицу — что бы работать с ячейкой ниже

Для начала по тематике Python — работа с Excel — достаточно. В ближайшем будущем эта тема будет рассмотрена подробнее 🙂
Код в исходном виде доступен на Git-e. В случае возникновения вопросов — пожалуйста, пишите 🙂