2015-06-26 3 views
1

Я хотел бы, чтобы получить результаты из большого массива (поступающий из базы данных) в браузер (с колбой) с использованием методы совместно в their documentation:Как вернуть одну сгенерированную строку из csv?

@app.route('/large.csv') 
def generate_large_csv(): 
    def generate(): 
     for row in iter_all_rows(): 
      yield ','.join(row) + '\n' 
    return Response(generate(), mimetype='text/csv') 

С изюминкой: Вместо того, чтобы генерировать файл CSV самому (присоединитесь к ',', добавив разделительную линию), я бы хотел использовать пакет csv.

Теперь, единственный способ я нашел, чтобы вернуть только один письменный линию, чтобы сделать следующее:

@app.route('/large.csv') 
def generate_large_csv(): 
    def generate(): 
     for row in iter_all_rows(): 
      dest = io.StringIO() 
      writer = csv.writer(dest) 
      writer.writerow(row) 
      yield dest.getvalue() 

    return Response(generate(), mimetype='text/csv') 

Но создание нового io.StringIO & csv.writer для каждой строки просто не кажется правильным на всех!

Я взглянул на пакет documentation, но я не смог найти что-то, что только вернет одну строку.

+0

является CSV вы хотите «поток» со статическим или динамическим содержимым? – Anzel

+0

Я не уверен, что понял ваш вопрос; «Строка» является результатом базы данных. Он может содержать 0 строк до миллиона. Это не файл, хранящийся на диске. –

+0

Да, я думаю, что неправильно понял ваш вопрос, потому что вы не упомянули, откуда исходит источник. Поэтому я задаюсь вопросом, является ли контент, который вы хотите передать, либо статическим динамическим. Причина, по которой я спрашиваю, состоит в том, что, если содержимое является статическим, у вас есть возможность не передавать поток, используя флягу, а сам веб-сервер, такой как Nginx – Anzel

ответ

2

Вы можете легко с помощью настраиваемого объекта файла. Если вы создаете объект с write методами, который просто хранит входной данные и дать ему в CSV писатель, это делается:

class keep_writer: 
    def write(self, txt): 
     self.txt = txt 

@app.route('/large.csv') 
def generate_large_csv(): 
    def generate(): 
     kw = keep_writer() 
     wr = csv.writer(kw) # add optional configuration for the csv.writer 
     for row in iter_all_rows(): 
      wr.writerow(row) # just write the row 
      yield kw.txt  # and yield the line build by the csv.writer 
    return Response(generate(), mimetype='text/csv') 
+0

Удивительный, умный, и именно то, что мне нужно, спасибо :) –

Смежные вопросы