处理存储在云端(S3 或 Spaces)的文件
Processing files stored on cloud (S3 or Spaces)
我设置了一个脚本来处理 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
下载文件,然后将其作为本地文件处理?感觉效率低下?我有哪些选择?
您可以获得文件的字节内容,将其包装在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]
我设置了一个脚本来处理 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
下载文件,然后将其作为本地文件处理?感觉效率低下?我有哪些选择?
您可以获得文件的字节内容,将其包装在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]