Django實(shí)現(xiàn)下載超大CSV文件的示例代碼
在處理大數(shù)據(jù)集的時(shí)候,我們經(jīng)常遇到的一個(gè)問題是內(nèi)存使用。當(dāng)我們?cè)噲D生成一個(gè)大型文件,如 CSV,并嘗試將其全部加載到內(nèi)存中時(shí),可能會(huì)遇到內(nèi)存不足的問題。幸運(yùn)的是,Django 提供了一個(gè)解決方案:流傳輸。本文將詳細(xì)的講述如何利用 Django 進(jìn)行大型 CSV 文件的流傳輸。
流傳輸?shù)幕A(chǔ)概念
流傳輸是一種技術(shù),允許你一次發(fā)送一小部分響應(yīng),而不是一次性加載整個(gè)響應(yīng)到內(nèi)存中。這種技術(shù)對(duì)于服務(wù)大文件,如圖像,音頻和大型數(shù)據(jù)集非常有用。
創(chuàng)建 Django StreamingHttpResponse 對(duì)象
StreamingHttpResponse 對(duì)象允許我們將響應(yīng)內(nèi)容按部分,或者說“流”的形式發(fā)送給客戶端。試看以下代碼:
from django.http import StreamingHttpResponse
def big_file_download(request):
def file_iterator(file_name, chunk_size=512):
with open(file_name, "rb") as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
response = StreamingHttpResponse(file_iterator('big_file.csv'))
return response
在這里,我們首先創(chuàng)建一個(gè)生成器函數(shù) file_iterator,它以 chunk_size 為單位讀取文件,然后用這個(gè)生成器函數(shù)作為 StreamingHttpResponse 的參數(shù),從而創(chuàng)建出一個(gè)可以流傳輸?shù)捻憫?yīng)對(duì)象。
實(shí)現(xiàn) Django 流傳輸大型 CSV 文件
現(xiàn)在,我們知道了如何創(chuàng)建 StreamingHttpResponse 對(duì)象,接著看一下如何用它來流傳輸大型 CSV 文件:
import csv
from django.http import StreamingHttpResponse
from .models import Person
class Echo:
def write(self, value):
return value
def streaming_csv_view(request):
persons = Person.objects.all().values_list('name', 'age', 'city')
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer)
response = StreamingHttpResponse((writer.writerow(person) for person in persons),
content_type="text/csv")
response['Content-Disposition'] = 'attachment; filename="persons.csv"'
return response
在上述代碼中,我們創(chuàng)建了一個(gè) Echo 類,并將其實(shí)例 pseudo_buffer 作為 csv.writer 的參數(shù)。這樣,我們可以以迭代的方式寫入 CSV 行,而不必把它們?nèi)考虞d到內(nèi)存中。之后,我們把這個(gè) writerow 方法的迭代器作為 StreamingHttpResponse 的參數(shù)。注意,我們此時(shí)仍需要設(shè)置正確的 MIME 類型和 Content-Disposition 頭部。
總結(jié)
這就是如何使用 Django 的 StreamingHttpResponse 對(duì)象來流傳輸大型 CSV 文件。完成這個(gè)特性后,你應(yīng)該能夠更高效地處理大數(shù)據(jù)集,且大大降低了內(nèi)存使用。
到此這篇關(guān)于Django實(shí)現(xiàn)下載超大CSV文件的示例代碼的文章就介紹到這了,更多相關(guān)Django下載大文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python模塊導(dǎo)入的幾種方法實(shí)現(xiàn)
本文主要介紹了Python模塊導(dǎo)入的幾種方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
Python迭代器iterator生成器generator使用解析
這篇文章主要介紹了Python迭代器iterator生成器generator使用解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Python3 多線程(連接池)操作MySQL插入數(shù)據(jù)
本文將結(jié)合實(shí)例代碼,介紹Python3 多線程(連接池)操作MySQL插入數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
淺談在django中使用redirect重定向數(shù)據(jù)傳輸?shù)膯栴}
這篇文章主要介紹了淺談在django中使用redirect重定向數(shù)據(jù)傳輸?shù)膯栴},具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
pytorch更新tensor中指定index位置的值scatter_add_問題
這篇文章主要介紹了pytorch更新tensor中指定index位置的值scatter_add_問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Python數(shù)據(jù)分析處理(三)--運(yùn)動(dòng)員信息的分組與聚合
這篇文章主要介紹了Python數(shù)據(jù)清洗與處理?運(yùn)動(dòng)員信息的分組與聚合,根據(jù)Python數(shù)據(jù)清洗與處理?的相關(guān)資料展開運(yùn)動(dòng)員信息的分組與聚合的文章內(nèi)容,需要的朋友可以參考一下2021-12-12
python中關(guān)于對(duì)super()函數(shù)疑問解惑
Python中的super()是用于調(diào)用父類(或父類的父類...)方法的函數(shù),主要用于多繼承,單繼承問題不大,下面這篇文章主要給大家介紹了關(guān)于python中關(guān)于對(duì)super()函數(shù)疑問解惑的相關(guān)資料,需要的朋友可以參考下2022-08-08
Python深度學(xué)習(xí)pytorch卷積神經(jīng)網(wǎng)絡(luò)LeNet
這篇文章主要為大家講解了Python深度學(xué)習(xí)中的pytorch卷積神經(jīng)網(wǎng)絡(luò)LeNet的示例解析,有需要的朋友可以借鑒參考下希望能夠有所幫助2021-10-10

