在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实现文件分组复制到不同目录的例子
Jun 04 Python
python文件与目录操作实例详解
Feb 22 Python
Python之str操作方法(详解)
Jun 19 Python
python 对txt中每行内容进行批量替换的方法
Jul 11 Python
python3爬虫怎样构建请求header
Dec 23 Python
使用python打印十行杨辉三角过程详解
Jul 10 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
Pandas时间序列:时期(period)及其算术运算详解
Feb 25 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
Jun 28 Python
python和C++共享内存传输图像的示例
Oct 27 Python
Django对接elasticsearch实现全文检索的示例代码
Aug 02 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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
PHP Ajax实现页面无刷新发表评论
2007/01/02 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python实现获取命令行输出结果的方法
2017/06/10 Python
python的unittest测试类代码实例
2017/12/07 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
python复制文件到指定目录的实例
2018/04/27 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
python可以用哪些数据库
2020/06/22 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
会计毕业生自荐信
2013/11/21 职场文书
银行存款证明样本
2014/01/17 职场文书
信访工作者先进事迹
2014/01/17 职场文书
大学同学聚会邀请函
2014/01/29 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
初婚初育证明范本
2014/11/24 职场文书
2014年招生工作总结
2014/11/26 职场文书
初中语文教师研修日志
2015/11/13 职场文书
python 如何在list中找Topk的数值和索引
2021/05/20 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS