2014-11-18 5 views
10

Ich habe keine Probleme beim Schreiben einer CSV außerhalb des Flask-Frameworks. Aber wenn ich versuche, es von Flask aus zu schreiben, schreibt es in die CSV, aber nur in einer Zeile. HierSchreiben einer CSV aus dem Flask-Framework

ist die Vorlage Ich folge

@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 

Dies schreibt die CSV perfekt, aber wenn ich mit meinem Code versuchen, erhalte ich eine lange Reihe.

Mein Code:

@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 

Meine Ausgabe:

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 

Dank.

EDIT: Ich versuchte fast alle Antworten und sie arbeiteten zum größten Teil, aber ich wählte vectorfrog, weil es mit dem, was ich versuchte, zu erreichen.

+1

Sie sollten Verwenden Sie wahrscheinlich das csv-Modul (https://docs.python.org/2/library/csv.html). –

+0

Auch dies ist eine idiomatische Art, eine Datei zum Herunterladen in Kolben zu erstellen: http://flask.pooco.org/snippets/32/ –

+0

Danke, @ DavidK.Hess! Ich habe nicht nur versucht, Python-Grundlagen zu lernen, sondern wirklich versucht, idiomatischen Code zu schreiben. Das hilft definitiv. – tmthyjames

Antwort

33

Ich habe so etwas wie dies vor kurzem fand ich, dass ich an erster Stelle notwendig, um die csv in eine StringIO und dann die StringIO zurückzukehren. Wenn Sie die csv wollen, hier ein Download zu sein, was ich tat:

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 
5

Sie müssen Zeilenumbrüche hinzufügen. Wie auch immer, Ihre Methode, csv s zu erstellen (die Liste auszudrucken und Klammern daraus zu entfernen) ist nicht der beste Weg, dies zu tun. Versuchen Sie stattdessen:

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

Oder verwenden Sie das csv Modul:

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 
1

Seit csv ist nur ein Textformat Sie shure, die neue Linie Separator machen shoud - \n am Ende jeder Zeile vorhanden ist Sie haben

1

Ich bin mir nicht ganz sicher, ob ich Ihr Ziel verstehe, aber Sie können die str.join() Methode versuchen. Also, wenn Sie eine schnelle CSV-Ausgabe aus einer Liste von Listen machen wollten:

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

Eine Alternative ::

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() 

Eine weitere Alternative ist Flask-Excel zu verwenden:

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() 
Verwandte Themen