I have no problems writing a CSV outside of the Flask framework. But when I try to write it from Flask, it writes to the CSV, but only on one line.
Here is the template I'm following
@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 This writes the CSV perfectly, but when I try with my code, I get one long row.
My 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 My output:
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 Thanks.
EDIT: I tried just about all the answers and they worked for the most part, but I chose vectorfrog's because it fit with what I was trying to accomplish.
I did something like this recently, I found that I needed to first place the csv into a StringIO and then return the StringIO. If you want the csv to be a download, here's what I did:
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
You need to add newlines. Anyway, your method of making csvs (printing the list and removing brackets from it) is not the best way to do it. Try this instead:
csvList = '\n'.join(','.join(row) for row in csvList) Or use the csv module:
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With