2016-06-07 23 views
0

我正在編寫一個頁面來上傳.csv文件並將其內容導入到我的模型中。我當前視圖:Django - 如何從內存中的.csv文件導入

class ContentImport(LoginRequiredMixin, PermissionRequiredMixin,View): 
    permission_required = 'delivery.change_delivery' 

    def get(self, request, *args, **kwargs):    
     form = UploadFileForm() 
     return render(request, 'delivery/content_import.html', { 'form': form })  

    def import_contents(self, f): 
     reader = csv.reader(f) 
     for row in reader: 
      print row[0] 

    def post(self, request, *args, **kwargs): 

     form = UploadFileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      self.import_contents(request.FILES['file'].read()) 
      messages.add_message(self.request, messages.SUCCESS, "Contents deleted successfully.") 
      return redirect(reverse('delivery:delivery-detail', args=[self.kwargs['delivery_id']])) 
     else: 
      messages.add_message(self.request, messages.ERROR, "Select a file to upload.") 
      return redirect(reverse('delivery:delivery-content-import', args=[self.kwargs['delivery_id']])) 

我的問題是關於import_contents方法和調用它self.import_contents(request.FILES['file'].read())。當我print row[0]我得到以下錯誤:列表索引超出範圍。

我對這個觀點的看法是上傳文件,不保存在服務器中,從內存中讀取.csv並在我的模型中創建新記錄。這從.csv讀取我從其他答案在這裏在stackoverflow。

我認爲問題是我如何將文件傳遞給import_contents函數或我如何從中讀取。我無法弄清楚。你可以幫我嗎?如果您對如何以更簡單的方式或正確的方式提出建議,請告訴我。

感謝您的任何幫助

+2

當你傳遞給'import_contents'時,不要調用'read()'。 –

+1

[將Django文件上傳對象提供給Python CSV模塊的意外結果]可能重複(http://stackoverflow.com/questions/1396126/unexpected-results-feeding-django-file-upload-object-to-python-csv-模塊) –

+0

@DanielRoseman它的工作,謝謝!現在我必須處理正確的.csv閱讀。當我使用row [0]時,它返回整行,而不是0列。但是這是我現在需要弄清楚的一件事。 –

回答

3

這是你的問題。

self.import_contents(request.FILES['file'].read()) 

csv.reader()需要一個類似於對象的文件,而不是它的內容。

This絕對可以解釋爲相關答案。

+0

正如丹尼爾在我的問題中沒有.read()的作品所說的那樣。現在我正在處理導入。當我調用row [0]時,它會返回整行,而不是第0列。感謝您的回答! –

+1

很酷。但是當前的'csv.reader()'問題可以在python/django控制檯上很容易地調試。如果有幫助:區別可能在'delimiter'或'quotechar' https://docs.python.org/2/library/csv.html 也許,方言選項可能對你有幫助。 – zEro

+0

謝謝,它工作。閱讀器現在就像這樣,按預期工作:reader = csv.reader(f,delimiter =';',quotechar ='「') –