在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实现全角半角字符互转的方法
Nov 28 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
Python高级特性与几种函数的讲解
Mar 08 Python
python游戏开发之视频转彩色字符动画
Apr 26 Python
通过python实现弹窗广告拦截过程详解
Jul 10 Python
Python爬虫抓取技术的一些经验
Jul 12 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 Python
对python中的os.getpid()和os.fork()函数详解
Aug 08 Python
Django异步任务线程池实现原理
Dec 17 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
Apr 08 Python
大数据分析用java还是Python
Jul 06 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 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
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
PHP时间格式控制符对照表分享
2013/07/23 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
javascript Event对象详解及使用示例
2013/11/22 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
JavaScript 数组的进化与性能分析
2017/09/18 Javascript
JavaScript中Array方法你该知道的正确打开方法
2018/09/11 Javascript
ES6 let和const定义变量与常量的应用实例分析
2019/06/27 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
vue点击按钮实现简单页面的切换
2020/09/08 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
python 字典(dict)按键和值排序
2016/06/28 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
pyqt5 从本地选择图片 并显示在label上的实例
2019/06/13 Python
Python的形参和实参使用方式
2019/12/24 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
工商企业管理实习自我鉴定
2013/12/04 职场文书