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.