在Python的Django框架中生成CSV文件的方法


Posted in Python onJuly 22, 2015

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 类型),它它传给需要处理文件的函数,然后返回这个响应对象。

Python 相关文章推荐
Python ORM框架SQLAlchemy学习笔记之数据查询实例
Jun 10 Python
Python实现多线程HTTP下载器示例
Feb 11 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
使用Python制作微信跳一跳辅助
Jan 31 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
Django页面数据的缓存与使用的具体方法
Apr 23 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
python 解决flask 图片在线浏览或者直接下载的问题
Jan 09 Python
python dumps和loads区别详解
Feb 04 Python
python 使用while循环输出*组成的菱形实例
Apr 12 Python
详解用python -m http.server搭一个简易的本地局域网
Sep 24 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 #Python
在Lighttpd服务器中运行Django应用的方法
Jul 22 #Python
简单的Apache+FastCGI+Django配置指南
Jul 22 #Python
使用FastCGI部署Python的Django应用的教程
Jul 22 #Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 #Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 #Python
通过mod_python配置运行在Apache上的Django框架
Jul 22 #Python
You might like
PHP 面向对象实现代码
2009/11/11 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
<script defer> defer 是什么意思
2009/05/10 Javascript
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
微信小程序input抖动问题的修复方法
2021/03/03 Javascript
Python 返回汉字的汉语拼音
2009/02/27 Python
详解python 注释、变量、类型
2018/08/10 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
Python学习之os模块及用法
2020/06/03 Python
python交互模式基础知识点学习
2020/06/18 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
PHP面试题及答案二
2015/05/23 面试题
为什么在使用动态 SQL 语句时必须为低层数据库对象授予权限
2012/12/13 面试题
创业计划书的主要内容有哪些
2014/01/29 职场文书
三个儿子教学反思
2014/02/03 职场文书
保密工作责任书
2014/04/16 职场文书
不忘国耻振兴中华演讲稿
2014/05/14 职场文书
中学音乐课教学反思
2016/02/18 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
Golang 正则匹配效率详解
2021/04/25 Golang
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android