Python конвертировать список строк в zip архив файлов - PullRequest
0 голосов
/ 06 февраля 2020

В скрипте python у меня есть список строк, где каждая строка в списке будет представлять текстовый файл. Как мне преобразовать этот список строк в zip-архив файлов?

Например:

list = ['file one content \nblah \nblah', 'file two content \nblah \nblah']

Я пробовал варианты следующих

import zipfile
from io import BytesIO
from datetime import datetime
from django.http import HttpResponse

def converting_strings_to_zip():

    list = ['file one content \nblah \nblah', 'file two content \nblah \nblah']

    mem_file = BytesIO()
    with zipfile.ZipFile(mem_file, "w") as zip_file:
        for i in range(2):
            current_time = datetime.now().strftime("%G-%m-%d")
            file_name = 'some_file' + str(current_time) + '(' + str(i) + ')' + '.txt'
            zip_file.writestr(file_name, str.encode(list[i]))

        zip_file.close()

    current_time = datetime.now().strftime("%G-%m-%d")
    response = HttpResponse(mem_file, content_type='application/zip')
    response['Content-Disposition'] = 'attachment; filename="'str(current_time) + '.zip"'

    return response

Но только приводит к 0kb ZIP-файлов

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Был в состоянии решить эту проблему, поменяв пару строк (не прибегая к сохранению списков в виде файлов, затем архивируя файлы на жесткий диск сервера, затем загружая zip-файл в память и отправляя по трубопроводу клиенту, как предлагают текущие ответы) ).

import zipfile
from io import BytesIO
from datetime import datetime
from django.http import HttpResponse

def converting_strings_to_zip():

    list = ['file one content \nblah \nblah', 'file two content \nblah \nblah']

    mem_file = BytesIO()
    zip_file = zipfile.ZipFile(mem_file, 'w', zipfile.ZIP_DEFLATED)
    for i in range(2):
        current_time = datetime.now().strftime("%G-%m-%d")
        file_name = 'some_file' + str(current_time) + '(' + str(i) + ')' + '.txt'
        zip_file.writestr(file_name, str.encode(list[i]))

    zip_file.close()

    current_time = datetime.now().strftime("%G-%m-%d")
    response = HttpResponse(mem_file.getvalue(), content_type='application/zip')
    response['Content-Disposition'] = 'attachment; filename="'str(current_time) + '.zip"'

    return response
0 голосов
/ 06 февраля 2020

Вы можете просто записать каждую строку в отдельный файл в папке, которую вы mkdir, и затем сжать ее с помощью библиотеки zipfile или с помощью shutil, который является частью стандартной библиотеки python. После того как вы записали строку в каталог по вашему выбору, вы можете сделать:

import shutil

shutil.make_archive('strings_archive.zip', 'zip', 'folder_to_zip')

ссылка .

...