【问题标题】:Writing a CSV from Flask framework [duplicate]从 Flask 框架编写 CSV [重复]
【发布时间】:2015-01-15 20:09:31
【问题描述】:

我在 Flask 框架之外编写 CSV 没有问题。但是当我尝试从 Flask 编写它时,它会写入 CSV,但仅在一行上。

这是我正在关注的模板

@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

这完美地写入了 CSV,但是当我尝试使用我的代码时,我得到了一个长行。

我的代码:

@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

我的输出:

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

谢谢。

编辑:我尝试了几乎所有的答案,它们大部分都有效,但我选择了vectorfrog,因为它符合我想要完成的目标。

【问题讨论】:

标签: python csv flask


【解决方案1】:

我最近做了这样的事情,我发现我需要先将csv放入StringIO,然后返回StringIO。如果您希望 csv 成为下载,这就是我所做的:

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

【讨论】:

  • 在 python3 中,StringIO 位于 io 模块中,而不是 StringIO 模块中:import io; io.StringIO()
  • 不错!真的对我有用。
  • @Charlotte 超级感谢这次更新!
【解决方案2】:

您需要添加换行符。无论如何,您制作csvs 的方法(打印列表并从中删除括号)并不是最好的方法。试试这个:

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

或使用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

【讨论】:

    【解决方案3】:

    另一种选择::

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

    另一种选择是使用 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 __name__ == "__main__":
        app.debug=True
        app.run()
    

    【讨论】:

      【解决方案4】:

      由于csv 只是一种纯文本格式,因此您应该确保新的行分隔符 - \n 出现在您拥有的每一行的末尾

      【讨论】:

        【解决方案5】:

        我不太确定我是否理解您的目标,但您可以尝试str.join() 方法。因此,如果您想从列表列表中快速生成 CSV 输出:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-28
          • 2019-02-23
          • 2020-03-20
          • 2018-01-25
          • 2011-08-26
          • 2012-06-03
          • 2011-10-20
          • 1970-01-01
          相关资源
          最近更新 更多