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 #Увеличиваем на единицу — что бы работать с ячейкой ниже

UPD: в более удобочитаемом виде 🙂 :

  1. import os #Подгружаем библиотеку для обработки системных команд
  2. import openpyxl #Подгружаем библиотеку для обработки  Excel-файлов
  3. import re
  4.  
  5. path = os.chdir('c:\\Users\\Oleksiy\\Desktop\\Полный список аптек в Украине\\')
  6.  
  7. list_directory = os.listdir(path) #В переменную загоняем список файлов в целевой директории
  8. #print('Список всех файлов \n', list_directory) #Выводим полный список файлов в каталоге
  9. #print(type(list_directory))
  10. for i in list_directory:
  11.     print('Начинаем обработку файла:', i)
  12.     wb = openpyxl.load_workbook(i)
  13.     sheets = wb.get_sheet_names()  # Получили полный список листов в файле и загнали в список
  14.     sheet = wb.get_sheet_by_name(sheets[0])
  15.     row_count = sheet.max_row  # Определили количество строк
  16.     column_count = sheet.max_column  # Определили количество колонок
  17.  
  18.     print('В документе', i, '\n - строк: ', row_count, '\n - колонок:', column_count)
  19.     print('\n')
  20.  
  21.     number_row = 2 #Вводим переменную, отвечающую за номер строки
  22.     letter_colomn = 'D' #Вводим переменную, отвечающую за колонку
  23.  
  24.     while number_row < row_count:
  25.         regxp = '((067|098|050|066|097|068|099|093|096)\d{7})' #Регулярное выражение для поиска мобильных номеров
  26.         number_row = str(number_row)
  27.         row = letter_colomn + number_row #Создаем переменную ячейки, с которой будем работать
  28.         row = str(row) #Конвертируем ее в строковую
  29.         temp_number = sheet[row].value #В переменную загоняем значение ячейки
  30.         temp_number = str(temp_number) #Конвертируем это значение в строковую
  31.  
  32.         temp_number = temp_number.replace('(', '').replace(')', '').replace(' ', '').replace('-', '').replace('.',
  33.                                                                                                               '').replace(
  34.             ',', '')  #Обрезали все лишнее в номере - тире, точки, скобочки
  35.         result_number = re.findall(regxp, temp_number)  #Начинаем парсить по номеру (напоминаю, номер уже окультурили)
  36.  
  37.         #typer = type(result_number)
  38.         lens = len(result_number) #Вводим переменную, отвечающую за количество элементов после парсинга
  39.         result_number = str(result_number)
  40.         if lens == 1: #Если элемент один
  41.             number_to_file = result_number[3:12] #Берем все цифры в указанном промежутке
  42.             with open('number.txt', 'a', encoding='utf8') as f: #Создаем файл - если его не было раньше - в режиме дозаписи
  43.                 f.write(number_to_file + '\n') #Сохраняем в файл найденный и очищенный номер мобильного телефона
  44.         elif lens == 2: #Если элементов два
  45.             number_to_file = result_number[3:12]  # Берем все цифры в указанном промежутке
  46.             number_to_file2 = result_number[26:35] #Берем все цифры в указанном промежутке
  47.             with open('number.txt', 'a', encoding='utf8') as f: #Создаем файл - если его не было раньше - в режиме дозаписи
  48.                 f.write(number_to_file + '\n' + number_to_file2 + '\n') #Сохраняем в файл найденный и очищенный номер мобильного телефона
  49.  
  50.         number_row = int(number_row) #Конвертируем переменную в инт
  51.         number_row = number_row + 1 #Увеличиваем на единицу - что бы работать с ячейкой ниже

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