在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 使用Django輸出CSV
編寫自定義存儲(chǔ)系統(tǒng)
高級(jí)
編寫你的第一個(gè)Django應(yīng)用,第5部分
視圖層
Django管理文檔生成器
編寫你的第一個(gè) Django 程序 第3部分
編寫你的第一個(gè)Django應(yīng)用,第6部分
模型層
中間件
測(cè)試
數(shù)據(jù)庫(kù)訪問(wèn)優(yōu)化
文件上傳
中間件
驗(yàn)證器
基于類的內(nèi)建通用視圖
部署靜態(tài)文件
使用Django認(rèn)證系統(tǒng)
高級(jí)教程:如何編寫可重用的應(yīng)用
Model 類參考
Django 初探
使用Django輸出PDF
模型的實(shí)例
模型
文件上傳
進(jìn)行原始的sql查詢
面向程序員
中間件
編寫數(shù)據(jù)庫(kù)遷移
TemplateResponse 和 SimpleTemplateResponse
異常
Django中的測(cè)試
基礎(chǔ)
管理器
File對(duì)象
URL調(diào)度器
加密簽名
國(guó)際化和本地化
日志
查詢集
django-admin 和 manage.py
使用基于類的視圖處理表單
聚合
內(nèi)建基于類的視圖的API
如何使用會(huì)話
部署 Django
其它
其它核心功能
高級(jí)
Django中的密碼管理
模型元選項(xiàng)
按需內(nèi)容處理
查找 API 參考
高級(jí)
Django 的快捷函數(shù)
Django 的設(shè)置
Admin
開(kāi)發(fā)過(guò)程
新手入門
基于類的視圖
模型實(shí)例參考
信號(hào)
表單素材 ( <code>Media</code> 類)
自定義查找
常見(jiàn)的網(wǎng)站應(yīng)用工具
模型
django.contrib.humanize
Django模版語(yǔ)言
點(diǎn)擊劫持保護(hù)
管理操作
編寫你的第一個(gè) Django 程序 第2部分
Django安全
模式編輯器
多數(shù)據(jù)庫(kù)
部署
基于類的視圖
內(nèi)建的視圖
視圖裝飾器
面向設(shè)計(jì)師
編寫視圖
應(yīng)用程序
如何使用WSGI 部署
參考
表單 API
文件儲(chǔ)存API
認(rèn)證
國(guó)際化和本地化
錯(cuò)誤報(bào)告
基礎(chǔ)
基礎(chǔ)
將遺留數(shù)據(jù)庫(kù)整合到Django
教程
Django異常
編寫你的第一個(gè) Django 程序 第4部分
遷移
分頁(yè)
重定向應(yīng)用
表單
從零開(kāi)始
為模型提供初始數(shù)據(jù)
設(shè)置
使用Django輸出CSV
關(guān)聯(lián)對(duì)象參考
使用表單
Django 中的用戶認(rèn)證
快速安裝指南
安全問(wèn)題歸檔
數(shù)據(jù)庫(kù)函數(shù)
編寫自定義的django-admin命令
高級(jí)教程
管理文件
格式本地化
基于類的通用視圖 —— 索引
安全
系統(tǒng)檢查框架
為Django編寫首個(gè)補(bǔ)丁
模板層
Widgets
編寫你的第一個(gè) Django 程序 第1部分
執(zhí)行查詢

使用Django輸出CSV

這篇文檔闡述了如何通過(guò)使用Django視圖動(dòng)態(tài)輸出CSV (Comma Separated Values)。 你可以使用Python CSV 庫(kù)或者Django的模板系統(tǒng)來(lái)達(dá)到目的。

使用Python CSV庫(kù)

Python自帶了CSV庫(kù),csv。在Django中使用它的關(guān)鍵是,csv模塊的CSV創(chuàng)建功能作用于類似于文件的對(duì)象,并且Django的HttpResponse對(duì)象就是類似于文件的對(duì)象。

這里是個(gè)例子:

import csv
from django.http import HttpResponse

def some_view(request):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'

    writer = csv.writer(response)
    writer.writerow(['First row', 'Foo', 'Bar', 'Baz'])
    writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"])

    return response

代碼和注釋是不用多說(shuō)的,但是一些事情需要提醒一下:

  • 響應(yīng)對(duì)象獲得了一個(gè)特殊的MIME類型,text/csv。這會(huì)告訴瀏覽器,文檔是個(gè)CSV文件而不是HTML文件。如果你把它去掉,瀏覽器可能會(huì)把輸出解釋為HTML,會(huì)在瀏覽器窗口中顯示一篇丑陋的、可怕的官樣文章。
  • 響應(yīng)對(duì)象獲取了附加的Content-Disposition協(xié)議頭,它含有CSV文件的名稱。文件名可以是任意的;你想把它叫做什么都可以。瀏覽器會(huì)在”另存為“對(duì)話框中使用它,或者其它。
  • 鉤住CSV生成API非常簡(jiǎn)單:只需要把response作為第一個(gè)參數(shù)傳遞給csv.writer。csv.writer 函數(shù)接受一個(gè)類似于文件的對(duì)象,而HttpResponse 對(duì)象正好合適。
  • 對(duì)于你CSV文件的每一行,調(diào)用writer.writerow,向它傳遞一個(gè)可迭代的對(duì)象比如列表或者元組。
  • CSV模板會(huì)為你處理引用,所以你不用擔(dān)心沒(méi)有轉(zhuǎn)義字符串中的引號(hào)或者逗號(hào)。只需要向writerow()傳遞你的原始字符串,它就會(huì)執(zhí)行正確的操作。

在Python 2中處理Unicode

Python2的csv模塊不支持Unicode輸入。由于Django在內(nèi)部使用Unicode,這意味著從一些來(lái)源比如HttpRequest讀出來(lái)的字符串可能導(dǎo)致潛在的問(wèn)題。有一些選項(xiàng)用于處理它:

  • 手動(dòng)將所有Unicode對(duì)象編碼為兼容的編碼。
  • 使用csv模塊示例章節(jié)中提供的UnicodeWriter類。
  • 使用python-unicodecsv 模塊,它作為csv模塊隨時(shí)可用的替代方案,能夠優(yōu)雅地處理Unicode。

更多信息請(qǐng)見(jiàn)csv模塊的Python文檔。

流式傳輸大尺寸CSV文件

當(dāng)處理生成大尺寸響應(yīng)的視圖時(shí),你可能想要使用Django的StreamingHttpResponse類。例如,通過(guò)流式傳輸需要長(zhǎng)時(shí)間來(lái)生成的文件,可以避免負(fù)載均衡器在服務(wù)器生成響應(yīng)的時(shí)候斷掉連接。

在這個(gè)例子中,我們利用Python的生成器來(lái)有效處理大尺寸CSV文件的拼接和傳輸:

import csv

from django.utils.six.moves import range
from django.http import StreamingHttpResponse

class Echo(object):
    """An object that implements just the write method of the file-like
    interface.
    """
    def write(self, value):
        """Write the value by returning it, instead of storing in a buffer."""
        return value

def some_streaming_csv_view(request):
    """A view that streams a large CSV file."""
    # Generate a sequence of rows. The range is based on the maximum number of
    # rows that can be handled by a single sheet in most spreadsheet
    # applications.
    rows = (["Row {}".format(idx), str(idx)] for idx in range(65536))
    pseudo_buffer = Echo()
    writer = csv.writer(pseudo_buffer)
    response = StreamingHttpResponse((writer.writerow(row) for row in rows),
                                     content_type="text/csv")
    response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
    return response

使用模板系統(tǒng)

或者,你可以使用Django模板系統(tǒng)來(lái)生成CSV。比起便捷的Python csv模板來(lái)說(shuō),這樣比較低級(jí),但是為了完整性,這個(gè)解決方案還是在這里展示一下。

它的想法是,傳遞一個(gè)項(xiàng)目的列表給你的模板,并且讓模板在for循環(huán)中輸出逗號(hào)。

這里是一個(gè)例子,它像上面一樣生成相同的CSV文件:

from django.http import HttpResponse
from django.template import loader, Context

def some_view(request):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'

    # The data is hard-coded here, but you could load it from a database or
    # some other source.
    csv_data = (
        ('First row', 'Foo', 'Bar', 'Baz'),
        ('Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"),
    )

    t = loader.get_template('my_template_name.txt')
    c = Context({
        'data': csv_data,
    })
    response.write(t.render(c))
    return response

這個(gè)例子和上一個(gè)例子之間唯一的不同就是,這個(gè)例子使用模板來(lái)加載,而不是CSV模塊。代碼的結(jié)果 -- 比如content_type='text/csv' -- 都是相同的。

然后,創(chuàng)建模板my_template_name.txt,帶有以下模板代碼:

{% for row in data %}"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}"
{% endfor %}

這個(gè)模板十分基礎(chǔ)。它僅僅遍歷了提供的數(shù)據(jù),并且對(duì)于每一行都展示了一行CSV。它使用了addslashes模板過(guò)濾器來(lái)確保沒(méi)有任何引用上的問(wèn)題。

其它基于文本的格式

要注意對(duì)于 CSV來(lái)說(shuō),這里并沒(méi)有什么特別之處 -- 只是特定了輸出格式。你可以使用這些技巧中的任何一個(gè),來(lái)輸出任何你想要的,基于文本的格式。你也可以使用相似的技巧來(lái)生成任意的二進(jìn)制數(shù)據(jù)。例子請(qǐng)參見(jiàn)在Django中輸出PDF。

譯者:Django 文檔協(xié)作翻譯小組,原文:Generating CSV。

本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請(qǐng)保留作者署名和文章出處。

Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。

{% endraw %}