2013-06-21 35 views
1

我試圖通過Django應用程序將CSV文件上傳到Google App Engine中的Blobstore文件。我遇到了一個問題,因爲上傳的文件可能以錯誤的換行符結束。所以,我需要在python的通用換行符模式下打開上傳的文件。 Django文檔建議我可以在File對象上使用.open(),設置一個新模式。如何將通過Django上傳的CSV文件存儲到Google App Engine上的blobstore?

這是我提出的解決方案:

 filename = files.blobstore.create(mime_type='text/csv') 
     csvfile = request.FILES.get('csvfile') 

     with files.open(filename, 'a') as output_file: 
      with csvfile.open(mode='rU') as input_file: 
       output_file.write(input_file.readline()) 

(「文件」是App Engine的API的一部分)

這項權利似乎給我,但我想知道如果任何人受到了類似的情況和更好的解決方案?

+0

FWIW,上面的代碼是給我上__exit__爲csvfile上下文管理的一個例外。也許我需要手動打開並關閉它?從[文檔](https://docs.djangoproject.com/en/1.4/ref/files/file/)可能甚至想要做什麼是不完全清楚的。 – foresmac

+0

這裏是例外,這對我來說建議Django的files.File類不實現上下文管理器協議,也許?儘管它是Python文件對象的包裝器? '用csvfile.open(mode ='rU')作爲input_file: AttributeError:__exit__' – foresmac

回答

1

我已經設法做到這一點。你必須重複上傳的文件

filename = files.blobstore.create(mime_type='text/csv') 
csvfile = request.FILES.get('csvfile') 

with files.open(filename, 'a') as output_file: 
    writer = csv.writer(output_file, quoting=csv.QUOTE_NONE) 
    for row in csv.reader(csvfile.read().splitlines()): 
     writer.writerow(row) 

files.finalize(filename) 

希望工程

+0

我會試一試;謝謝! – foresmac

相關問題