Когда требуется работать с большим объёмом данных, необходимо продумать варианты автоматизации процесса.

В сегодняшнем случае нам надо обработать табличный файл xlsx и сохранить заархивировав в gzip.

До того, как появилась необходимость написать скрипт, ответственные по конвертированию и сохранению файлов использовали таблицы Excel с надстройками Export CSV. Но по мере увеличения количества строк в xlsx программа не справлялась и зависала.

Теоретически процесс выстроен следующим образом: Файл в формате xlsx копируется в папку, где находится скрипт. При запуске этот скрипт сканирует содержимое папки, находит и обрабатывает указанный файл, предоставляя результат в требуемом формате.

Для реализации проекта мы решили использовать язык программирования Python.

Библиотеки для работы следующие:

  1. pandas: Библиотека для анализа и обработки данных.
  2. gzip: Модуль для работы с файлами, сжатыми алгоритмом gzip.
  3. shutil: Модуль для высокоуровневых операций с файлами и директориями.
  4. 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():

  1. Cохранять DataFrame необходимо было с определёнными параметрами метода to_csv(), а именно:
    • sep=';':
      Устанавливает разделитель полей в CSV-файле как точку с запятой (;) вместо стандартной запятой.
    • encoding='utf-8':
      Задает кодировку файла как UTF-8, что обеспечивает правильное отображение символов различных языков.
    • lineterminator='\n':
      Определяет символ конца строки. В данном случае используется стандартный символ новой строки.
  2. После сохранения некоторые числовые столбцы стали содержать плавающую точку на конце. Нужно было преобразовать эти столбцы в целочисленный тип 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.

Программист, идейный вдохновитель и автор статьи: Юрий Шанти

Специалист в области создания и продвижения сайтов в интернете, обладающий знаниями в веб-разработке и SEO.
Пишите: в Telegram