Чтение файла CSV через Flask [дубликат]

Я почти не отвечаю на вопрос с множеством ответов, но это решение имеет отличную совместимость, и я еще не видел его:

.hidden-element {
  position: absolute;
  z-index: -1;
  pointer-events: none;
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s, opacity .5s ease-out;
}

.hidden-element.visible {
  position: static;
  z-index: auto;
  pointer-events: auto;
  visibility: visible;
  opacity: 1;
}

Объяснение: он использует трюк visibility: hidden (который совместим с «show-and-animate» за один шаг), но использует комбинацию position: absolute; z-index: -1; pointer-events: none;, чтобы убедиться, что скрытый контейнер не занимает места и не отвечает на взаимодействия пользователя.

5
задан Shivendra 11 October 2015 в 22:55
поделиться

1 ответ

ОК, поэтому есть одна серьезная проблема с вашим скриптом, csv.reader, как отмечено здесь , ожидает объект файла или, по крайней мере, объект, который поддерживает протокол итератора. Вы передаете str, который реализует протокол итератора, но вместо того, чтобы итерации через строки, он итерации через символы. Вот почему у вас есть результат, который вы делаете.

Во-первых, он дает одиночный символ 1, который csv.reader видит как линию с одним полем. После этого str дает еще один символ ,, который csv.reader видит как строку с двумя пустыми полями (так как запятая является разделителем полей). Это продолжается на протяжении всего str, пока оно не исчерпается.

Решение (или хотя бы одно решение) должно превратить str в файл-подобный объект. Я попытался использовать поток, предоставленный flask.request.files["name"], но это не выполняет итерацию по линиям. Затем я попытался использовать cStringIO.StringIO, и у него, похоже, была аналогичная проблема. Я закончил в этот вопрос, который предложил объект io.StringIO в режиме универсальной новой строки, который работал. Я закончил со следующим рабочим кодом (возможно, это было бы лучше):

__author__ = 'shivendra'
from flask import Flask, make_response, request
import io
import csv

app = Flask(__name__)

def transform(text_file_contents):
    return text_file_contents.replace("=", ",")


@app.route('/')
def form():
    return """
        <html>
            <body>
                <h1>Transform a file demo</h1>

                <form action="/transform" method="post" enctype="multipart/form-data">
                    <input type="file" name="data_file" />
                    <input type="submit" />
                </form>
            </body>
        </html>
    """

@app.route('/transform', methods=["POST"])
def transform_view():
    f = request.files['data_file']
    if not f:
        return "No file"

    stream = io.StringIO(f.stream.read().decode("UTF8"), newline=None)
    csv_input = csv.reader(stream)
    #print("file contents: ", file_contents)
    #print(type(file_contents))
    print(csv_input)
    for row in csv_input:
        print(row)

    stream.seek(0)
    result = transform(stream.read())

    response = make_response(result)
    response.headers["Content-Disposition"] = "attachment; filename=result.csv"
    return response

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5001, debug=True)
25
ответ дан Community 23 August 2018 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: