Во-первых, получите код для получения 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 вместо списка просто строк. Эти объекты содержат больше данных обо всех файлах.