在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使用cookie库操保存cookie详解
Mar 03 Python
Python入门之modf()方法的使用
May 15 Python
Python实现身份证号码解析
Sep 01 Python
python fabric实现远程部署
Jan 05 Python
Python IDLE入门简介
Dec 08 Python
对numpy中向量式三目运算符详解
Oct 31 Python
python实现任意位置文件分割的实例
Dec 14 Python
Python线程条件变量Condition原理解析
Jan 20 Python
python将dict中的unicode打印成中文实例
May 11 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
Python Pillow(PIL)库的用法详解
Sep 19 Python
一篇文章带你搞懂Python类的相关知识
May 20 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实现两表合并成新表并且有序排列的方法
2014/12/05 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
解析URI与URL之间的区别与联系
2013/11/22 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
用js替换除数字与逗号以外的所有字符的代码
2014/06/07 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
js实现无缝滚动图
2017/02/22 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
Vuex 使用 v-model 配合 state的方法
2018/11/13 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
Python函数返回值实例分析
2015/06/08 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
python对Excel的读取的示例代码
2020/02/14 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
Python timeit模块原理及使用方法
2020/10/10 Python
蛋白质世界:Protein World
2017/11/23 全球购物
白莲教口号
2014/06/18 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
详解python的内存分配机制
2021/05/10 Python
MYSQL主从数据库同步备份配置的方法
2021/05/26 MySQL
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电