2014-11-18 13 views
10

Flask çerçevesinin dışında bir CSV yazarken sorun yaşıyorum. Fakat Flask'tan yazmayı denediğimde, CSV'ye yazıyor, ancak sadece bir satırda yazıyor. İşte Flask çerçevesinden bir CSV yazma

Ben Bu mükemmel CSV yazar

@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 

takip ediyorum şablon, ama benim koduyla çalıştığınızda, ben bir uzun satır olsun.

Kodum:

@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 

Benim çıkışı:

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 

teşekkürler.

DÜZENLEME: Hemen hemen tüm cevapları denedim ve çoğunlukla çalıştılar, ancak vectorfrog'u seçtim çünkü başarmaya çalıştığım şeye uyuyordu.

+1

Gitmelisiniz Muhtemelen csv (https://docs.python.org/2/library/csv.html) modülünü kullanıyor olmalısınız. –

+0

Ayrıca, bu balonun içinde indirmek için bir dosya oluşturmak için daha deyimsel bir yoldur: http://flask.pocoo.org/snippets/32/ –

+0

Teşekkürler, @ DavidK.Hess! Sadece python temellerini öğrenmeye çalışmıyorum, ama gerçekten deyimsel kod yazmaya çalışıyordum. Bu kesinlikle yardımcı olur. – tmthyjames

cevap

33

Geçenlerde böyle bir şey yaptım, ben ilk etapta bir StringIO içine csv gerekli ve ardından StringIO dönmek bulundu. Eğer csv bir indirme olmasını istiyorsanız, işte bunu yaptık:

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

Yeni hatlar eklemeniz gerekiyor. Her neyse, csv s yapma yönteminiz (listeyi yazdırmak ve parantezleri buradan kaldırmak), bunu yapmanın en iyi yolu değildir.

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

Ya csv modülü kullanmak: Bu yolu deneyin csv yana

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

yeni hat ayırıcı sen shure yapmak sınırlandırmak sadece düz metin biçimidir - \n her satırın sonunda bulunur

1

Hedefinizi anladığımdan emin değilim, ancak str.join() yöntemini deneyebilirsiniz. Eğer listelerin bir listeden hızlı bir CSV çıktı yapmak istiyorsa Yani,:

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

Bir alternatif ::

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

diğer alternatif kullanmak Flask-Excel geçerli:

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