在Python的Django框架中生成CSV文件的方法
CSV是一种简单的数据格式,通常为电子表格软件所使用。它主要是由一系列的表格行组成,每行中单元格之间使用逗号(CSV是逗号分隔数值(comma-separatedvalues)的缩写)隔开。例如,下面是CSV格式的“不守规矩”的飞机乘客表。
Year,UnrulyAirlinePassengers 1995,146 1996,184 1997,235 1998,200 1999,226 2000,251 2001,299 2002,273 2003,281 2004,304 2005,203 2006,134 2007,147
备注
前面的列表包含真实数据。这些数据来自美国联邦航空管理局。
CSV格式尽管看起来简单,却是全球通用的。但是不同的软件会生成和使用不同的CSV的变种,在使用上会有一些不便。幸运的是,Python使用的是标准CSV库,csv,所以它更通用。
因为csv模块操作的是类似文件的对象,所以可以使用HttpResponse替换:
importcsv fromdjango.httpimportHttpResponse #Numberofunrulypassengerseachyear1995-2005.Inarealapplication #thiswouldlikelycomefromadatabaseorsomeotherback-enddatastore. UNRULY_PASSENGERS=[146,184,235,200,226,251,299,273,281,304,203] defunruly_passengers_csv(request): #CreatetheHttpResponseobjectwiththeappropriateCSVheader. response=HttpResponse(mimetype='text/csv') response['Content-Disposition']='attachment;filename=unruly.csv' #CreatetheCSVwriterusingtheHttpResponseasthe"file." writer=csv.writer(response) writer.writerow(['Year','UnrulyAirlinePassengers']) for(year,num)inzip(range(1995,2006),UNRULY_PASSENGERS): writer.writerow([year,num]) returnresponse
代码和注释可以说是很清楚,但还有一些事情需要特别注意:
- 响应返回的是text/csvMIME类型(而非默认的text/html)。这会告诉浏览器,返回的文档是CSV文件。
- 响应会有一个附加的Content-Disposition头部,它包含有CSV文件的文件名。这个头部(或者说,附加部分)会指示浏览器弹出对话框询问文件存放的位置(而不仅仅是显示)。这个文件名是任意的。它会显示在浏览器的另存为对话框中。
- 要在HttpResponse指定头部信息,只需把HttpResponse当做字典使用就可以了。
- 与创建CSV的应用程序界面(API)挂接是很容易的:只需将response作为第一个变量传递给csv.writer。csv.writer函数需要一个文件类的对象,HttpResponse正好能达成这个目的。
- 调用writer.writerow,并且传递给它一个类似list或者tuple的可迭代对象,就可以在CSV文件中写入一行。
- CSV模块考虑到了引用的问题,所以您不用担心逸出字符串中引号和逗号。只要把信息传递给writerow(),它会处理好所有的事情。
在任何需要返回非HTML内容的时候,都需要经过以下几步:创建一个HttpResponse响应对象(需要指定特殊的MIME类型),它它传给需要处理文件的函数,然后返回这个响应对象。