在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程序运行效率的6个方法
Mar 31 Python
老生常谈python之鸭子类和多态
Jun 13 Python
利用python实现简单的循环购物车功能示例代码
Jul 05 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
Python2.7 实现引入自己写的类方法
Apr 29 Python
Flask框架配置与调试操作示例
Jul 23 Python
python生成多个只含0,1元素的随机数组或列表的实例
Nov 12 Python
Djang的model创建的字段和参数详解
Jul 27 Python
pyinstaller将含有多个py文件的python程序做成exe
Apr 29 Python
Pandas实现一列数据分隔为两列
May 18 Python
python--shutil移动文件到另一个路径的操作
Jul 13 Python
python中%格式表达式实例用法
Jun 18 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 file_get_contents函数轻松采集html数据
2010/04/22 PHP
PHP学习笔记之二
2011/01/17 PHP
PHP学习之正则表达式
2011/04/17 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
2012/02/27 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
2017/09/30 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
[06:35]2014DOTA2国际邀请赛 老男孩梦圆西雅图中国军团世界最强
2014/07/22 DOTA
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python列表推导式的使用方法
2013/11/21 Python
python实现清屏的方法
2015/04/30 Python
python3中str(字符串)的使用教程
2017/03/23 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
Python如何实现爬取B站视频
2020/05/20 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
详细总结Python常见的安全问题
2021/05/21 Python
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS