这篇文章主要介绍了在Python的Django框架中生成CSV文件的方法,利用到了Python下的csv模块,需要的朋友可以参考下
CSV 是一种简单的数据格式,通常为电子表格软件所使用。 它主要是由一系列的表格行组成,每行中单元格之间使用逗号(CSV 是 逗号分隔数值(comma-separated values) 的缩写)隔开。例如,下面是CSV格式的“不守规矩”的飞机乘客表。
- Year,Unruly Airline Passengers
- 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 替换:
- import csv
- from django.http import HttpResponse
- # Number of unruly passengers each year 1995 - 2005. In a real application
- # this would likely come from a database or some other back-end data store.
- UNRULY_PASSENGERS = [146,184,235,200,226,251,299,273,281,304,203]
- def unruly_passengers_csv(request):
- # Create the HttpResponse object with the appropriate CSV header.
- response = HttpResponse(mimetype='text/csv')
- response['Content-Disposition'] = 'attachment; filename=unruly.csv'
- # Create the CSV writer using the HttpResponse as the "file."
- writer = csv.writer(response)
- writer.writerow(['Year', 'Unruly Airline Passengers'])
- for (year, num) in zip(range(1995, 2006), UNRULY_PASSENGERS):
- writer.writerow([year, num])
- return response
代码和注释可以说是很清楚,但还有一些事情需要特别注意:
响应返回的是 text/csv MIME类型(而非默认的 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 类型),它它传给需要处理文件的函数,然后返回这个响应对象。
新闻热点
疑难解答