2015-09-17 47 views
3

我使用Python 2.7和Django 1.7。如何生成一個文件,而無需將其保存到Python中的磁盤?

我有一個方法在我的管理界面中生成某種類型的csv文件。

def generate_csv(args): 
    ... 
    #some code that generates a dictionary to be written as csv 
    .... 

    # this creates a directory and returns its filepath 
    dirname = create_csv_dir('stock') 

    csvpath = os.path.join(dirname, 'mycsv_file.csv') 
    fieldnames = [#some field names] 

    # this function creates the csv file in the directory shown by the csvpath 
    newcsv(data, csvheader, csvpath, fieldnames) 

    # this automatically starts a download from that directory 
    return HttpResponseRedirect('/media/csv/stock/%s' % csvfile) 

總而言之,我創建了一個CSV文件,保存在某個地方它在磁盤上,然後通過它的網址給用戶下載。

我在想如果所有這些都可以在不寫入光盤的情況下完成。我搜索了一下,也許內容處置附件可能會幫助我,但我在文檔中迷失了一下。

無論如何,如果有一個更簡單的方法來做到這一點,我很想知道。

+0

查找到'StringIO' –

+1

看起來這是非常類似的問題在這裏,因爲它幾乎相同事情,只是不同的有效載荷:http://stackoverflow.com/questions/908258/generating-file-to-download-with-django – Ragora

回答

4

感謝@ Ragora,您指引我走向正確的方向。

我改寫了newcsv方法:

def newcsv(data, csvheader, fieldnames): 
    """ 
    Create a new csv file that represents generated data. 
    """ 
    csvrow = [] 
    new_csvfile = StringIO.StringIO() 
    wr = csv.writer(new_csvfile, quoting=csv.QUOTE_ALL) 
    wr.writerow(csvheader) 
    wr = csv.DictWriter(new_csvfile, fieldnames = fieldnames) 

    for key in data.keys(): 
     wr.writerow(data[key]) 

    return new_csvfile 

,並在管理:

csvfile = newcsv(data, csvheader, fieldnames) 

response = HttpResponse(csvfile.getvalue(), content_type='text/csv') 
response['Content-Disposition'] = 'attachment; filename=stock.csv' 
return response 
+0

謝謝,但如何導入'StringIO'? [這](https://stackoverflow.com/questions/11914472/stringio-in-python3)沒有幫助 – Timo

-2

如果惹惱您將文件保存到磁盤,只需將application/octet-stream內容類型添加到Content-Disposition標頭,然後從磁盤刪除文件。

如果此標頭(Content-Disposition的),其與所述應用/ octet-流內容類型的響應時使用的,隱含的建議是,用戶代理不應該顯示的響應,而是直接進入一個`保存作爲......的對話「。

相關問題