MemoryStream. Читайте не копирует байты для буферизации - c#

ОК, поэтому есть одна серьезная проблема с вашим скриптом, 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)

18
задан agnieszka 17 December 2008 в 21:52
поделиться

4 ответа

Попытайтесь установить imageStream. Положение к 0. Когда Вы пишете в MemoryStream, он перемещает Положение после байтов, которые Вы просто записали поэтому, при попытке читать там нет ничего.

39
ответ дан 30 November 2019 в 05:39
поделиться

Необходимо сбросить указатель файла.

imageStream.Seek( 0, SeekOrigin.Begin );

Иначе Вы читаете из конца потока.

25
ответ дан 30 November 2019 в 05:39
поделиться

Добавьте:

imageStream.Position = 0;

прямо прежде:

imageStream.Read(contentBuffer, 0, contentBuffer.Length);

0 в Вашей инструкции по чтению обозначает смещение от текущей позиции в потоке памяти, не запуск потока. После того, как поток был загружен, положение в конце. Необходимо сбросить его к началу.

13
ответ дан 30 November 2019 в 05:39
поделиться
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);
8
ответ дан 30 November 2019 в 05:39
поделиться
Другие вопросы по тегам:

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