Защита паролем файла Excel (.xlsx) с помощью Python в Databricks

Вопрос или проблема

Я хочу защитить Excel файл паролем, который доступен в S3 бакете, и сохранить его обратно в S3. Я попытался сделать это с помощью openpyxl и xlsxwriter, они создают xlsx файл, но он открывается без запроса пароля.

import openpyxl
import shutil

def password_protect_excel(filename, password):
# Загружаем рабочую книгу из местоположения монтирования
workbook = openpyxl.load_workbook(filename)

    # Заглушка для защиты паролем
    print(f"Попытка установить пароль на рабочую книгу: {password}")

    # Сохраним рабочую книгу сначала в локальном временном каталоге
    temp_local_path = "/tmp/Report_temp.xlsx"
    workbook.save(temp_local_path)

    return temp_local_path

if __name__ == "__main__":
# Определяем пути к местам монтирования
input_file = "/dbfs/mnt/file_mount_report/Report.xlsx"
output_file = "/dbfs/mnt/file_mount_report/Report_protected_new.xlsx"

    # Заглушка для пароля
    password = "ваш_сильный_пароль"

    # Шаг 1: Обрабатываем файл Excel
    temp_local_path = password_protect_excel(input_file, password)

    # Шаг 2: Перемещаем сохраненный файл в местоположение монтирования
    shutil.copy(temp_local_path, output_file)

    print(f"Рабочая книга сохранена по адресу {output_file}")

Ответ или решение

Для защиты Excel файла паролем, доступного в S3 бакете, с последующим сохранением его обратно в S3, вам потребуется использовать библиотеку pywin32 или другие решения, потому что openpyxl и xlsxwriter не поддерживают установку пароля непосредственно.

В данном ответе мы будем использовать библиотеку pyxlsb, которая позволяет работать с xlsb и openpyxl для чтения и записи xlsx файлов, но для защиты файла паролем лучше использовать pywin32 для Windows или библиотеку msoffice, если вы используете Databricks.

Поскольку pywin32 требует Windows, мы будем использовать библиотеку msoffice, так что сначала убедитесь, что у вас есть необходимая библиотека в вашем окружении Databricks.

Вот пример кода для защиты Excel файла паролем:

import pandas as pd
import boto3
from io import BytesIO
import openpyxl

def download_file_from_s3(bucket_name, file_key):
    s3_client = boto3.client('s3')
    file_stream = BytesIO()

    s3_client.download_fileobj(bucket_name, file_key, file_stream)
    file_stream.seek(0)

    return file_stream

def upload_file_to_s3(bucket_name, file_key, file_stream):
    s3_client = boto3.client('s3')
    file_stream.seek(0)

    s3_client.upload_fileobj(file_stream, bucket_name, file_key)

def password_protect_excel(file_stream, password):
    # Сохраняем файл в временный формат (xlsx)
    temp_file = "temp_excel.xlsx"
    with open(temp_file, 'wb') as f:
        f.write(file_stream.read())

    # Открываем файл с помощью openpyxl
    workbook = openpyxl.load_workbook(temp_file)

    # Для защиты паролем используем метод XLSXWriter
    protected_file = "protected_excel.xlsx"
    writer = pd.ExcelWriter(protected_file, engine='xlsxwriter')

    # Перебираем все листы и записываем их
    for sheet_name in workbook.sheetnames:
        df = pd.read_excel(temp_file, sheet_name=sheet_name)
        df.to_excel(writer, sheet_name=sheet_name, index=False)

    # Устанавливаем пароль на уровень файла
    writer.book.password = password
    writer.save()

    # Читаем защищенный файл обратно в память
    with open(protected_file, 'rb') as f:
        protected_stream = BytesIO(f.read())

    return protected_stream

def main():
    bucket_name = "your_bucket_name"
    input_key = "path/to/your_input_file.xlsx"
    output_key = "path/to/your_output_file_protected.xlsx"
    password = "your_strong_password"

    # Шаг 1: Скачивание файла из S3
    file_stream = download_file_from_s3(bucket_name, input_key)

    # Шаг 2: Защита файла паролем
    protected_file_stream = password_protect_excel(file_stream, password)

    # Шаг 3: Загрузка защищенного файла обратно в S3
    upload_file_to_s3(bucket_name, output_key, protected_file_stream)

    print(f"Файл успешно защищен паролем и загружен в S3: {output_key}")

if __name__ == "__main__":
    main()

Примечания:

  1. Убедитесь, что у вас установлены необходимые библиотеки: boto3, pandas, openpyxl, xlsxwriter.
  2. Замените your_bucket_name, path/to/your_input_file.xlsx и path/to/your_output_file_protected.xlsx на актуальные адреса вашего бакета и файлов.
  3. Не забудьте настроить AWS доступ через IAM для работы с S3.
  4. Проверьте, установлены ли соответствующие зависимости в вашем Databricks окружении.

Таким образом, вы сможете эффективно защитить Excel файл паролем и сохранить его обратно в S3.

Оцените материал
Добавить комментарий

Капча загружается...