這篇文章主要介紹了在Python的Django框架中生成CSV文件的方法,利用到了Python下的csv模塊,需要的朋友可以參考下
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 類型),它它傳給需要處理文件的函數,然后返回這個響應對象。
新聞熱點
疑難解答