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.
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
Vous devez ajouter des nouvelles lignes. Quoi qu’il en soit, votre méthode pour créer des csv
s (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
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()
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.
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)