Чтение zip-файла, отправленного на сервер flask, без сохранения его на диске - PullRequest
0 голосов
/ 11 марта 2020

Я хотел бы прочитать все файлы в zip-файле определенного типа c, отправляемом на сервер flask через почтовый запрос формы, без необходимости сохранения zip-файла на диске.

1 Ответ

1 голос
/ 11 марта 2020

Во-первых, получите код для получения zip-файла

from flask import Flask, request
app = Flask(__name__)

@app.route("/",methods=["GET"])
def page_name_get(): 
    return """<form action="." method="post" enctype=multipart/form-data>
        <input type="file" accept="application/zip" name="data_zip_file" accept="application/zip" required>
         <button type="submit">Send zip file!</button>
        </form>"""
app.run()

Вот так должна выглядеть функция отправки запроса:

import zipfile

@app.route("/",methods=["POST"])
def page_name_post():
    file = request.files['data_zip_file']  
    file_like_object = file.stream._file  
    zipfile_ob = zipfile.ZipFile(file_like_object)
    file_names = zipfile_ob.namelist()
    # Filter names to only include the filetype that you want:
    file_names = [file_name for file_name in file_names if file_name.endswith(".txt")]
    files = [(zipfile_ob.open(name).read(),name) for name in file_names]
    return str(files)

Теперь я буду go над этой строкой по строке

file = request.files['data_zip_file'] Сначала вам нужно получить объект file из запроса, это экземпляр класса werkzeug.datastructures.FileStorage.

file_like_object = file.stream._file здесь вы сначала берете поток атрибут werkzeug.datastructures.FileStorage это входной поток файла. Это вернет экземпляр tempfile.SpooledTemporaryFile класса, используемого для временных файлов. Из этого экземпляра вы берете атрибут ._file. Это вернет экземпляр tempfile._TemporaryFileWrapper Этого достаточно, как io.BytesIO, чтобы понять класс zipfile.ZipFile.

zipfile_ob = zipfile.ZipFile(file_like_object) здесь вы создаете zipfile.Zipfile объект

Теперь вы должны быть в состоянии сделать почти все, что вы хотели бы сделать с почтовым индексом. Чтобы выбрать файл из zip-файла, используйте метод zipfile_ob.open() и укажите путь к файлу, который вы хотите открыть.

Чтобы получить эти пути, мы используем file_names = zipfile_ob.namelist(), это вернет список со строками всех путей ко всем файлам и каталогам в zip.

Затем вы можете отфильтровать эти имена с помощью file_names = [file_name for file_name in file_names if file_name.endswith(".txt")]

Все те пути, которые вы хотите, теперь находятся в file_names. Затем вы можете извлечь данные этих файлов, используя функцию open.

files = [(zipfile_ob.open(name).read(),name) for name in file_names]

В приведенном примере я сохраню пути к файлу в окончательном списке, но если вы этого не сделаете хотите, чтобы вы могли использовать:

files = [zipfile_ob.open(name).read() for name in file_names] или использовать другой способ, чтобы go поверх файла. Если вам нужна дополнительная информация о файлах, есть также метод infolist(), который можно использовать вместо namelist(), который вернет список ZipInfo Objects вместо списка просто строк. Эти объекты содержат больше данных обо всех файлах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...