Вопрос или проблема
Я хочу защитить 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()
Примечания:
- Убедитесь, что у вас установлены необходимые библиотеки:
boto3
,pandas
,openpyxl
,xlsxwriter
. - Замените
your_bucket_name
,path/to/your_input_file.xlsx
иpath/to/your_output_file_protected.xlsx
на актуальные адреса вашего бакета и файлов. - Не забудьте настроить AWS доступ через IAM для работы с S3.
- Проверьте, установлены ли соответствующие зависимости в вашем Databricks окружении.
Таким образом, вы сможете эффективно защитить Excel файл паролем и сохранить его обратно в S3.