Python: запись файла и использование буфера

Я использую django для генерации персонализированного файла, но при этом генерируется файл, и с точки зрения использования пространства это довольно плохое решение.

вот как я это делаю сейчас:

with open(filename, 'wb') as f:
    pdf.write(f) #pdf is an object of pyPDF2 library

with open(filename, 'rb') as f:
    return send_file(data=f, filename=filename) #send_file is a HTTPResponse parametted to download file data

В приведенном выше коде генерируется файл.

Простым решением было бы удалить файл после его загрузки, но я помню, что в java для этого случая используется объект stream.

Возможно ли это сделать в Python?

РЕДАКТИРОВАНИЕ:

def send_file(data, filename, mimetype=None, force_download=False):
    disposition = 'attachment' if force_download else 'inline'
    filename = os.path.basename(filename)
    response = HttpResponse(data, content_type=mimetype or 'application/octet-stream')
    response['Content-Disposition'] = '%s; filename="%s"' % (disposition, filename)
    return response

Не зная точных деталей функций pdf.write и send_file, я полагаю, что в обоих случаях они принимают объект, соответствующий интерфейсу BinaryIO. Таким образом, вы можете попробовать использовать BytesIO для хранения содержимого в буфере в памяти, а не для записи в файл:

with io.BytesIO() as buf:
    pdf.write(buf)
    buf.seek(0)
    send_file(data=buf, filename=filename)

В зависимости от точной природы вышеупомянутых функций, YMMV.

Вернуться на верх