Ответ Django, содержащий zip-файл с несколькими CSV-файлами

У меня есть алгоритм, который выводит список кортежей, который готов для записи в CSV-файл.

Я пытаюсь записать 3 CSV-файла (через StringIO, поэтому нет записи на диск), а затем полностью заархивировать их. После этого я хочу присоединить это к ответу на запрос django.

Я не уверен, что это самый эффективный способ сделать это. Должен ли я использовать StringIO хранить 3 звонка через мой алгоритм? Должен ли я на самом деле создать файлы CSV, прежде чем архивировать их? Могу ли я напрямую использовать 1 zipfile звонок без промежуточных шагов звонка 3 StringIOs?

Спасибо

2 ответа

Решение

Вы можете сделать что-то вроде:

# Create the zip file
output = StringIO.StringIO()
f = zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED)
f.writestr('first.csv', '<the content of first.csv>')
f.writestr('second.csv', '<the content of second.csv>')
f.writestr('third.csv', '<the content of third.csv>')
f.close()
# Build your response
response = HttpResponse(output.getvalue(), mimetype='application/zip')
response['Content-Disposition'] = 'attachment; filename="yourzipfilename.zip"'
return response

Вы можете использовать StreamingHttpResponse(или FileResponse), если файл большой /questions/17342279/oshibka-pamyati-django-filewrapper-pri-obsluzhivanii-bolshih-fajlov/17342291#17342291

Помимо ответа от других, я также смог решить мою проблему

zipped_file = BytesIO()
with zipfile.ZipFile(zipped_file, 'a', zipfile.ZIP_DEFLATED) as zipped:
    for h in HEADER:  # determines which csv file to write
        rs = build_my_csv(h)
        csv_data = StringIO()
        writer = csv.writer(csv_data, delimiter=',')
        writer.writerow(HEADER[h])
        for r in rs:
            writer.writerow(r)
        csv_data.seek(0)
        zipped.writestr("{}.csv".format(h), csv_data.read())
zipped_file.seek(0)
response = HttpResponse(zipped_file, content_type='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename=some_name.zip'

Для этого используется идея отправки нескольких файлов.CSV в.ZIP без сохранения на диск в Python.

Другие вопросы по тегам