在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的三目运算符和not in运算符使用示例
Mar 03 Python
Python装饰器使用实例:验证参数合法性
Jun 24 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
Python进阶_关于命名空间与作用域(详解)
May 29 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
基于并发服务器几种实现方法(总结)
Dec 29 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
python绘制中国大陆人口热力图
Nov 07 Python
python利用dlib获取人脸的68个landmark
Nov 27 Python
pytorch使用tensorboardX进行loss可视化实例
Feb 24 Python
Python socket服务常用操作代码实例
Jun 22 Python
python3中TQDM库安装及使用详解
Nov 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 Sql Server连接失败问题及解决办法
2009/08/07 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
Laravel 5框架学习之环境与配置
2015/04/08 PHP
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
原生js实现日期联动
2015/01/12 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
树结构之JavaScript
2017/01/24 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
微信小程序用canvas画图并分享
2020/03/09 Javascript
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
python中私有函数调用方法解密
2016/04/29 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
Python实现生成随机数据插入mysql数据库的方法
2017/12/25 Python
Python实现的购物车功能示例
2018/02/11 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
浅析python的Lambda表达式
2019/02/27 Python
Python下简易的单例模式详解
2019/04/08 Python
Python容器类型公共方法总结
2020/08/19 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
2014年人民调解工作总结
2014/12/08 职场文书
2014年节能降耗工作总结
2014/12/11 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
全陪导游词开场白
2015/05/29 职场文书
大学学生会竞选稿
2015/11/19 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android