web-dev-qa-db-fra.com

Ecriture d'un framework CSV from Flask

Je n'ai aucun problème à écrire un fichier CSV en dehors du cadre Flask. Mais lorsque j'essaie d'écrire à partir de Flask, il écrit au format CSV, mais uniquement sur une ligne. 

Voici le modèle que je suis

@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

Cela écrit parfaitement le fichier CSV, mais lorsque j'essaie avec mon code, j'obtiens une longue ligne. 

Mon 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

Ma sortie:

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

Merci.

EDIT: / J'ai essayé à peu près toutes les réponses et ils ont travaillé pour la plupart, mais j'ai choisi Vectorfrog parce que cela correspond à ce que je voulais accomplir.

15
tmthyjames

J'ai fait quelque chose comme ça récemment, j'ai constaté que je devais d'abord placer le csv dans un StringIO, puis le retourner. Si vous voulez que le csv soit un téléchargement, voici ce que j'ai fait:

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
52
vectorfrog

Vous devez ajouter des nouvelles lignes. Quoi qu’il en soit, votre méthode pour créer des csvs (imprimer la liste et en supprimer les crochets) n’est pas la meilleure façon de procéder. Essayez ceci à la place:

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

Ou utilisez le module 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
6
parchment

Une 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 __== "__main__":
    app.debug=True
    app.run()

Une autre alternative consiste à utiliser 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 __== "__main__":
    app.debug=True
    app.run()
2
chfw

Puisque csv est juste un format de texte brut, vous devez vous assurer que le nouveau séparateur de lignes - \n est présent à la fin de chaque ligne que vous avez.

1
Oleh Novikov

Je ne suis pas sûr de bien comprendre votre objectif, mais vous pouvez essayer la méthode str.join () . Donc, si vous voulez créer une sortie CSV rapide à partir d’une liste de listes:

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