Python и Excel глазами НСИ

ebbda264d80ee95d92f03117fa00cb88.jpg


Всем привет! Меня зовут Алмаз. Я специалист по НСИ (нормативно-справочной информации) в компании Bimeister.
Хотел бы поделиться своим небольшим опытом автоматизации некоторых рутинных задач при работе с различными файлами и Excel- базами данных.

Python.

Предыстория.

Сейчас довольно много материала по данному языку программирования. Порой новичку очень сложно понять, с чего начать и в какую сторону двигаться. По крайней мере, для работы в инженерной области, найти что-то полезное для меня было не очень просто. Я начал изучать основы языка Python на Freecodecamp.org.

141f155730239bf5340f4ea74e5e6b2a.png

Хороший бесплатный ресурс, однако требует знания английского или хотя бы желание его выучить. Сам курс назывался «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». По нему много информации в сети. В моем случае этот модуль пришлось найти в интернете и положить в папку с файлом программы.

8790d118ba29fb539eacdc4420c8fc22.png

Далее все просто… Привожу ниже код программы:

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. На вкладке «Данные» кликаем «Получить данные», затем «Из файла»/ «Из папки» и выбираем нужную папку.

5957f5248a4fdcae3a86fe991e531bed.jpg

После загрузки данных, открывается окно:

362bf82773d4b5df3e524e1ea0700bf6.png

Нажимаем «Загрузить» и видим:

5fee9af8dd87347bfc0706d5321c1c1c.png

Нас интересуют столбцы Name (Имя файла) и Folder path (Адрес папки). Для получения адреса файла необходимо «соединить» эти два столбца. В ячейке G1 пишем формулу =F1&A1.

В итоге мы получим список в виде строк следующего вида:

\vol02\5_Цех №5\2_Установка производства кислорода\05_КИПиА\1.1.05.020.05.TIRSA 2–2.ПО.Паспорт на устройство контроля и регистрации ФЩЛ-502.pdf

Мы получили список полных адресов файлов, которые на сегодняшний день присутствуют в папке. Далее можно скачать эти файлы с помощью Python, как было объяснено выше.

Через несколько дней, когда нам сообщат, о том что выложены новые файлы в папку, создаем точно такой же файл.
Затем копируем данные из нового файла в «старый» и вставляем данные в одну таблицу ниже существующих данных. После этого с помощью инструмента » Удалить дубликаты», оставляем только адреса только новых файлов.

ae578322ece8f9dbe5dd5e9c48a9049f.png

Далее повторяем скачивание с помощью Python.

Таким образом, мы можем довольно быстро находить новые файлы в папке с уже существующими файлами и быстро их скачивать. Разумеется, данный метод не является идеалом. Если есть какие-то наработки в данной области, прошу поделиться в комментариях.

Надеюсь, данная статья будет полезна тем, кто хочет упростить свои повседневные задачи и начать применять современные технологии при работе с данными.

© Habrahabr.ru