Написание CSV из фляжной рамки

У меня нет проблем с написанием CSV вне рамки фляги. Но когда я пытаюсь записать его из Flask, он записывается в CSV, но только на одной строке.

Вот шаблон, который я следую за

@app.route('/download')
def download():
    csv = """"REVIEW_DATE","AUTHOR","ISBN","DISCOUNTED_PRICE"
"1985/01/21","Douglas Adams",0345391802,5.95
"1990/01/12","Douglas Hofstadter",0465026567,9.95
"1998/07/15","Timothy ""The Parser"" Campbell",0968411304,18.99
"1999/12/03","Richard Friedman",0060630353,5.95
"2004/10/04","Randel Helms",0879755725,4.50"""
    response = make_response(csv)
    response.headers["Content-Disposition"] = "attachment; filename=books.csv"
    return response

Это прекрасно записывает CSV, но когда я пытаюсь использовать свой код, я получаю одну длинную строку.

Мой код:

@app.route('/download')
def post(self):

    # lots of code

    csvList.append([all,my,data,goes,here])

    csvList = str(re.sub('\[|\]','',str(csvList)))  # convert to a string; remove brackets

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

Мой вывод:

Nashville Physician Service Ce,Treasury Specialist,Brentwood,TN,(615) 507-1646,La Petite Academy,Afternoon Teacher Aide,Goodlettsville,TN,(615) 859-2034,Nashville Physician Service Ce,Denial Resolution Specialist,Brentwood,TN,(615) 507-1646

Спасибо.

EDIT: Я пробовал практически все ответы, и они работали по большей части, но я выбрал vectorfrog, потому что он соответствовал тому, что я пытался выполнить.

Ответ 1

Я сделал что-то подобное недавно, я обнаружил, что мне нужно сначала разместить csv в StringIO, а затем вернуть StringIO. Если вы хотите, чтобы csv был загружен, вот что я сделал:

import StringIO
import csv
from flask import make_response

@app.route('/download')
def post(self):
    si = StringIO.StringIO()
    cw = csv.writer(si)
    cw.writerows(csvList)
    output = make_response(si.getvalue())
    output.headers["Content-Disposition"] = "attachment; filename=export.csv"
    output.headers["Content-type"] = "text/csv"
    return output

Ответ 2

Вам нужно добавить новые строки. В любом случае, ваш способ сделать csv (распечатать список и удалить скобки из него) - не лучший способ сделать это. Вместо этого попробуйте:

csvList = '\n'.join(','.join(row) for row in csvList)

Или используйте модуль csv:

import io, csv

dest = io.StringIO()
writer = csv.writer(dest)

for row in csvList:
    writer.writerow(row)

# Now dest is a file-like object containing your csv

Ответ 3

Так как csv - это просто текстовый формат, вы можете сделать вывод, что новый разделитель строк - \n присутствует в конце каждой строки, которая у вас есть

Ответ 4

Я не совсем уверен, что понимаю вашу цель, но вы можете попробовать метод str.join(). Итак, если вы хотите сделать быстрый вывод CSV из списка списков:

csvList= [['1', '2', '3'], ['4', '5', '6'], ['asdf', '7', 'eight']]
csvStrings= []
for csvLine in csvList:
    csvStrings += [",".join(csvLine)]
print "\n".join(csvStrings)

Ответ 5

Одна альтернатива::

from flask import Flask, make_response
import pyexcel as pe
import StringIO # py2.7, for python3, please use import io

app = Flask(__name__)

data = [
    ["REVIEW_DATE","AUTHOR","ISBN","DISCOUNTED_PRICE"],
    ["1985/01/21","Douglas Adams",'0345391802',5.95],
    ["1990/01/12","Douglas Hofstadter",'0465026567',9.95],
    ["1998/07/15","Timothy \"The Parser\" Campbell",'0968411304',18.99],
    ["1999/12/03","Richard Friedman",'0060630353',5.95],
    ["2004/10/04","Randel Helms",'0879755725',4.50]
]

@app.route('/download')
def download():
    sheet = pe.Sheet(data)
    io = StringIO.StringIO()
    sheet.save_to_memory("csv", io)
    output = make_response(io.getvalue())
    output.headers["Content-Disposition"] = "attachment; filename=export.csv"
    output.headers["Content-type"] = "text/csv"
    return output

if __name__ == "__main__":
    app.debug=True
    app.run()

Другой вариант - использовать Flask-Excel:

from flask import Flask, make_response
from flask.ext import excel

app = Flask(__name__)

data = [
    ["REVIEW_DATE","AUTHOR","ISBN","DISCOUNTED_PRICE"],
    ["1985/01/21","Douglas Adams",'0345391802',5.95],
    ["1990/01/12","Douglas Hofstadter",'0465026567',9.95],
    ["1998/07/15","Timothy \"The Parser\" Campbell",'0968411304',18.99],
    ["1999/12/03","Richard Friedman",'0060630353',5.95],
    ["2004/10/04","Randel Helms",'0879755725',4.50]
]

@app.route('/download')
def download():
    output = excel.make_response_from_array(data, 'csv')
    output.headers["Content-Disposition"] = "attachment; filename=export.csv"
    output.headers["Content-type"] = "text/csv"
    return output

if __name__ == "__main__":
    app.debug=True
    app.run()