Python и Excel глазами НСИ
Всем привет! Меня зовут Алмаз. Я специалист по НСИ (нормативно-справочной информации) в компании Bimeister.
Хотел бы поделиться своим небольшим опытом автоматизации некоторых рутинных задач при работе с различными файлами и Excel- базами данных.
Python.
Предыстория.
Сейчас довольно много материала по данному языку программирования. Порой новичку очень сложно понять, с чего начать и в какую сторону двигаться. По крайней мере, для работы в инженерной области, найти что-то полезное для меня было не очень просто. Я начал изучать основы языка Python на Freecodecamp.org.
Хороший бесплатный ресурс, однако требует знания английского или хотя бы желание его выучить. Сам курс назывался «Scientific Computing with Python», и вел его доктор Чак (Dr. Chuck, преподаватель Мичиганского университета). Доктор Чак очень просто и с юмором преподносит основные понятия и делится своим многолетним опытом для очень неискушенных учащихся.
Проучившись по несколько часов в неделю в течение нескольких месяцев, мне выпала возможность применить полученные навыки на практике.
Задача.
В сетевой папке лежат сканы документов в формате .pdf. Периодически документы в эту папку добавляются. Необходимо отслеживать новые поступления документов и скачивать их для дальнейшей обработки и загрузки в ПО на сервере клиента.
Так как количество документов может быть от нескольких единиц до нескольких сотен, то вручную данную работу сделать довольно проблематично. А если это надо делать ежедневно…
Решение.
Создаем список файлов, используя Excel. Работа с Excel будет рассмотрена в следующей части статьи. При добавлении в папку новых файлов создаем еще один список с помощью Excel.
Сравниваем со старым списком и в итоге у нас появляется список только новых файлов.
Такой список будет иметь строки в следующем виде:
\vol02\Цех №46\1_ОП\05_КИПиА\1.3.46.U01.451.ПО.Паспорт на средство измерения СТМ-10.pdf
Далее создаем текстовый файл в формате .txt и копируем в него наш список. Назовем этот файл List.txt:
\vol02\Цех №46\1_ОП\05_КИПиА\1.3.46.U01.451.ПО.Паспорт на средство измерения СТМ-10.pdf
\vol02\Цех №46\1_ОП\05_КИПиА\1.3.46.U01.452.ПО.Паспорт на средство измерения СТМ-10.pdf
\vol02\Цех №46\1_ОП\05_КИПиА\1.3.46.U01.453.ПО.Паспорт на средство измерения СТМ-10.pdf
Помещаем этот файл в папку с будущим файлом программы на Python. Для написания кода я использую «PyCharm Community Edition» (https://www.jetbrains.com/ru-ru/pycharm/download/other.html).
Запускаем Pycharm, создаем новый файл с расширением ».py» — Main.py.
Нам понадобится модуль «shutil». По нему много информации в сети. В моем случае этот модуль пришлось найти в интернете и положить в папку с файлом программы.
Далее все просто… Привожу ниже код программы:
import shutil
handle= open('list.txt', encoding='utf-8')
dest='D:\\Паспорта 55 цех\\Общ'
for line in handle:
src = line.strip()
#print(src)
shutil.copy(src, dest)
print("Copying file..",src[75:])
print('Finished')
Теперь разберем код программы подробнее:
«import shutil» — импортируем модель shutil;
«handle» открывает нам файл list.txt. Декодируем его в utf-8 — для исключения ошибок кодировки;
«dest» — указываем путь, куда скачивать файлы;
«for line in handle» — перебираем строки нашего списка с файлами в цикле;
«src = line.strip ()» — метод .strip разбивает текст, при этом при каждой итерации цикла в переменную src записывается адрес очередного файла;
»#print (src)» — закомментированный код. Если убрать символ #, то можно выводить на экрать текущую строку списка с адресом файла при каждой итерации цикла;
«shutil.copy (src, dest)» — метод ».copy» модуля «shutil», который непосредственно копирует файл из папки «src» в папку «dest»;
«print («Copying file…», src[75:])» — выводим на экран название файла (последние 75 символов строки из списка файлов);
«print ('Finished')» — выводим на экран уведомление об окончании процесса копирования.
Также обращаю внимание, что в коде программы адрес папки указан, используя двойные символы »//», а в списке файлов — используется одинарный »/». Это связано с особенностью кодировки символов в Python. Если данный вопрос интересен, то можно поискать материалы по теме «Escape последовательности».
Excel.
Задача.
Получить список только новых файлов в сетевой папке из первой части статьи.
Решение.
К примеру, сегодня в сетевую папку выложены файлы сканов документов. Завтра планируется, что в папку будут выложены еще файлы. При этом на дату создания ориентироваться нельзя, так как документы могут быть отсканированы в один день, а выложены в папку для скачивания через несколько дней. При этом более «ранние» файлы могут быть выложены позже.
Запускаем Excel. На вкладке «Данные» кликаем «Получить данные», затем «Из файла»/ «Из папки» и выбираем нужную папку.
После загрузки данных, открывается окно:
Нажимаем «Загрузить» и видим:
Нас интересуют столбцы Name (Имя файла) и Folder path (Адрес папки). Для получения адреса файла необходимо «соединить» эти два столбца. В ячейке G1 пишем формулу =F1&A1.
В итоге мы получим список в виде строк следующего вида:
\vol02\5_Цех №5\2_Установка производства кислорода\05_КИПиА\1.1.05.020.05.TIRSA 2–2.ПО.Паспорт на устройство контроля и регистрации ФЩЛ-502.pdf
Мы получили список полных адресов файлов, которые на сегодняшний день присутствуют в папке. Далее можно скачать эти файлы с помощью Python, как было объяснено выше.
Через несколько дней, когда нам сообщат, о том что выложены новые файлы в папку, создаем точно такой же файл.
Затем копируем данные из нового файла в «старый» и вставляем данные в одну таблицу ниже существующих данных. После этого с помощью инструмента » Удалить дубликаты», оставляем только адреса только новых файлов.
Далее повторяем скачивание с помощью Python.
Таким образом, мы можем довольно быстро находить новые файлы в папке с уже существующими файлами и быстро их скачивать. Разумеется, данный метод не является идеалом. Если есть какие-то наработки в данной области, прошу поделиться в комментариях.
Надеюсь, данная статья будет полезна тем, кто хочет упростить свои повседневные задачи и начать применять современные технологии при работе с данными.