Я почти не отвечаю на вопрос с множеством ответов, но это решение имеет отличную совместимость, и я еще не видел его:
.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;
, чтобы убедиться, что скрытый контейнер не занимает места и не отвечает на взаимодействия пользователя.
ОК, поэтому есть одна серьезная проблема с вашим скриптом, 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)