Обработка файлов, хранящихся в облаке (S3 или Spaces) - PullRequest
0 голосов
/ 17 мая 2019

Я настроил скрипт для обработки файлов Excel, загруженных пользователем.Сценарии прекрасно работают, когда файл хранится на локальном диске.

from openpyxl import load_workbook

wb = load_workbook("file_path.xlsx")  # Load workbook from disk works fine
ws = wb.worksheets[0]

Затем я настроил django-storages, чтобы разрешить сохранение загруженных пользователем файлов в цифровом океане.

Моя проблема сейчас заключается в том, как получить доступ к файлу, хранящемуся в облаке, и обработать его.Для записи, если я передам URL-адрес файла load_workbook, произойдет сбой с ошибкой No such file or directory: file_url.

Нужно ли загружать файл, используя requests, а затем обрабатывать его как локальный файл?Чувствует себя неэффективно?Какие варианты у меня есть?

1 Ответ

2 голосов
/ 17 мая 2019

Вы можете получить байтовое содержимое файла, обернуть его в ContentFile и передать его openpyxl.Предполагая, что ваша модель FileContainer и имя поля file:

from django.core.files.base import ContentFile
from openpyxl import load_workbook

fc = FileContainer.objects.first()
bytefile = fc.file.read()
wb = load_workbook(ContentFile(bytefile))
ws = wb.worksheets[0]

Я проверил ее с помощью S3, и она отлично работает.

Если вы хотите сохранить файл локально,Вы можете попробовать это:

from django.core.files.base import ContentFile
from django.core.files.storage import FileSystemStorage
from openpyxl import load_workbook

fc = FileContainer.objects.first()
local_storage = FileSystemStorage()

bytefile = fc.file.read()
newfile = ContentFile(bytefile)

relative_path = local_storage.save(fc.file.name, newfile)

wb = load_workbook(local_storage.path(relative_path))
ws = wb.worksheets[0]
...