Когда требуется работать с большим объёмом данных, необходимо продумать варианты автоматизации процесса.
В сегодняшнем случае нам надо обработать табличный файл xlsx и сохранить заархивировав в gzip.
До того, как появилась необходимость написать скрипт, ответственные по конвертированию и сохранению файлов использовали таблицы Excel с надстройками Export CSV. Но по мере увеличения количества строк в xlsx программа не справлялась и зависала.
Теоретически процесс выстроен следующим образом: Файл в формате xlsx копируется в папку, где находится скрипт. При запуске этот скрипт сканирует содержимое папки, находит и обрабатывает указанный файл, предоставляя результат в требуемом формате.
Для реализации проекта мы решили использовать язык программирования Python.
Библиотеки для работы следующие:
pandas
: Библиотека для анализа и обработки данных.gzip
: Модуль для работы с файлами, сжатыми алгоритмом gzip.shutil
: Модуль для высокоуровневых операций с файлами и директориями.os
: Модуль для взаимодействия с операционной системой.
В файле будет всего несколько объявленных функций:
- convert_xlsx_to_csv(xlsx_file, csv_file) — чтение XLSX файла и сохранение в CSV
- archive_csv(csv_file, archive_file) — архивирование CSV файла в GZ
- main() — основная функция для обработки всех XLSX файлов в текущей директории
Вот с какими особенностями работы с Python-скриптами мы столкнулись.
Функция чтения и сохранения файла convert_xlsx_to_csv():
- Cохранять DataFrame необходимо было с определёнными параметрами метода to_csv(), а именно:
sep=';'
:
Устанавливает разделитель полей в CSV-файле как точку с запятой (;) вместо стандартной запятой.encoding='utf-8'
:
Задает кодировку файла как UTF-8, что обеспечивает правильное отображение символов различных языков.lineterminator='\n'
:
Определяет символ конца строки. В данном случае используется стандартный символ новой строки.
- После сохранения некоторые числовые столбцы стали содержать плавающую точку на конце. Нужно было преобразовать эти столбцы в целочисленный тип int.
- Полная строка кода выглядит так:
for col in df.columns:
if df[col].dtype == 'float64':
df[col] = df[col].fillna(0).astype(int)
Функция архивирования CSV файла в GZ
Сама функция ничего необычного из себя не представляет — archive_csv(csv_file, archive_file)
В параметры функции подаётся входное и выходное значение.
Единственное, что пришлось сделать в главной функции main() это добавление к названию архива .csv, то есть на выходе файл, который в дальнейшем будет загружаться менеджером в систему, должен выглядеть следующим образом — tb_september_1709.csv.gz
csv_file = os.path.splitext(xlsx_file)[0] + '.csv'
archive_file = csv_file + '.gz'
Загрузка файлов через web-интерфейс
Сложность этого скрипта заключалась не в его запуске, а в необходимости установки на одном из компьютеров Python с виртуальной средой (venv), а также установки необходимых библиотек. Кроме того, человеку, который будет использовать этот скрипт, нужно объяснить, куда следует загрузить файл и как запустить процесс конвертации.
Так как у нас много файлов передаётся по внутренней локальной сети и есть сервер, который работает постоянно, мы повесили на него всю эту работу.
Нам же необходимо было написать web-загрузчик и обработчик файлов через кнопку в браузере.
Для взаимодействия python с web-интерфейсом использовали Flask — микрофреймворк для веб-приложений.
Форма html-загрузчика стандартная, которая методом HTTP-запроса POST передаёт файл на сервер по ссылке обработчика /upload
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" accept=".xlsx" required>
<button type="submit">Конвертировать</button>
</form>
Далее декоратором Flask, который связывает url с функцией, запускаем обработку загруженного файла.
После прохождения всех шагов в обработки, конвертации и архивирования отдаём файл обратно пользователю через send_file(archive_file, as_attachment=True)
Таким скриптом мы облегчили и ускорили работу персонала избавив от большого количества сложных действий для достижения результата.
Этим и полезна философия массовой обработки файлов при выполнении большого объёма информации. В данном случае нам помог язык программирования Python и микрофреймворк Flask.
Программист, идейный вдохновитель и автор статьи: Юрий Шанти