ОК, поэтому есть одна серьезная проблема с вашим скриптом, 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 """
Transform a file demo
"""
@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)
Попытайтесь установить imageStream. Положение к 0. Когда Вы пишете в MemoryStream, он перемещает Положение после байтов, которые Вы просто записали поэтому, при попытке читать там нет ничего.
Необходимо сбросить указатель файла.
imageStream.Seek( 0, SeekOrigin.Begin );
Иначе Вы читаете из конца потока.
Добавьте:
imageStream.Position = 0;
прямо прежде:
imageStream.Read(contentBuffer, 0, contentBuffer.Length);
0 в Вашей инструкции по чтению обозначает смещение от текущей позиции в потоке памяти, не запуск потока. После того, как поток был загружен, положение в конце. Необходимо сбросить его к началу.
Image img = Image.FromFile("F:\\Pulpit\\soa.bmp");
MemoryStream imageStream = new MemoryStream();
img.Save(imageStream, ImageFormat.Bmp);
byte[] contentBuffer = new byte[imageStream.Length];
imageStream.Position = 0;//Reset the position at the start
imageStream.Read(contentBuffer, 0, contentBuffer.Length);