Я делаю небольшой веб-сайт, используя Flask, с базой данных SQLite. Одна из вещей, которые я хочу сделать, это взять некоторые данные (из базы данных) и экспортировать их в виде файла Excel. Я хочу предложить вариант загрузки этого файла Excel. Один из вариантов сделать это — использовать Pandas для записи в файл Excel, который будет храниться на веб-сервере, и использовать send_file Flask, чтобы предложить вариант загрузки.
Однако возможно ли предоставить загружаемый файл Excel без сохранения файла «локально» на сервере? Например, на AWS S3. Я хочу иметь предсказуемый размер хранилища на веб-сервере. (И просто посмотрите, возможно ли это в любом случае.)
Одним из вариантов может быть запись в файл «локально», затем отправка его в AWS, а затем удаление с сервера. В идеале я бы предпочел напрямую захватить файловый поток, а затем отправить его на S3, но я не думаю, что это возможно, поскольку to_excel принимает только путь к файлу (или объект ExcelWriter, но он принимает путь к файлу).






Взято отсюда: Записать в объект StringIO с помощью Pandas Excelwriter?
Вы можете сбросить «выход» на S3
# Note, Python 2 example. For Python 3 use: output = io.BytesIO().
output = StringIO.StringIO()
# Use the StringIO object as the filehandle.
writer = pd.ExcelWriter(output, engine='xlsxwriter')
Позвольте мне попытаться понять, что вы пытаетесь сделать. Поток данных: БД --> Панды --> Excel --> S3. Итак, реальный вопрос: могут ли Pandas вернуть поток Excel вызывающей стороне, а не записывать его в файл?
Да, точно! Большое спасибо!
Я добавил более полный ответ ниже, надеюсь, вы не возражаете!
Чтобы добавить к ответу балдермана, полный код для его перехода на S3 будет
import io
import pandas as pd
import boto3
# ...
# make data frame 'df'
with io.BytesIO() as output:
with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
df.to_excel(writer)
data = output.getvalue()
s3 = boto3.resource('s3')
s3.Bucket('my-bucket').put_object(Key='data.xlsx', Body=data)
См. также Документация по XlsxWriter.
Спасибо, но это не совсем отвечает тому, что я хочу. Может быть, я был неясен. Я хочу загрузить файл, не сохраняя его в первую очередь. То есть
dataв вашем примере не читается из реального файла.