Python — работа с Excel. Ввел я в Google что бы найти хоть что-то, что поможет решить мне задачу, суть которой сводится к получению всех номеров мобильных телефонов из некоторого количества файлов Excel. Конечно, можно было вспомнить Zennoposter, о котором писал ранее, и методику работы которого с Excel описывал тут, но раз я изучаю Python — то почему бы не реализовать задачу на Python?
Более конкретно задача выглядит следующим образом: имеется 23 экселевских файла, в которых имеются полные адреса и телефоны ВСЕХ 😉 аптек в Украине (не факт, что информация слишком уж актуальная, учитывая, что взяты эти файлы с государственного сайта Министерства здравоохранения — а ведь все знают, как работают госслужащие, правда? 🙂 ).
Как бы там не было — нужно сделать что-то, что позволит получить номера всех мобильных телефонов, имеющихся в данных файлах. Конечно, можно сделать это и в ручном режиме. Всего-то и дел — открыть файл, просмотреть, и выписать номера мобильных. А что, если все автоматизировать с учетом нашей темы: Python — работа с Excel? Начнем!
Для примера откроем файл с адресами и телефонами аптек, расположенных в Ивано-Франковской области. Сам файл для примера доступен по ссылке. Если вы откроете файл, то увидите, что все номера телефонов расположены в колонке D, и начинаются с номера 2 (поверьте, остальные файлы построены по такой же схеме):
Т.е. нам нужно — открыть файл, и прочитать все номера телефонов, которые имеются в колонке 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: в более удобочитаемом виде 🙂 :
-
import os #Подгружаем библиотеку для обработки системных команд
-
import openpyxl #Подгружаем библиотеку для обработки Excel-файлов
-
import re
-
-
path = os.chdir('c:\\Users\\Oleksiy\\Desktop\\Полный список аптек в Украине\\')
-
-
list_directory = os.listdir(path) #В переменную загоняем список файлов в целевой директории
-
#print('Список всех файлов \n', list_directory) #Выводим полный список файлов в каталоге
-
#print(type(list_directory))
-
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) #Начинаем парсить по номеру (напоминаю, номер уже окультурили)
-
-
#typer = type(result_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. В случае возникновения вопросов — пожалуйста, пишите 🙂