2016-11-04 48 views
0

合作我有這樣的形式:的Django FileField或不使用Python 3的CSV模塊

class CSVImportForm(AuthorshipMixin, FormMixin, forms.Form): 

    data = forms.FileField() 

    def import_csv(self): 
     school_csv = csv.DictReader(self.cleaned_data['data']) 
     for row in school_csv: 
      print(row) 

import_csv()的預期目的是導入CSV到應用程序的數據庫,但它已經被改變爲簡潔起見。

當我嘗試遍歷school_csv,我猜會出現一個例外是當DictReader首先嚐試讀取文件:

Traceback: 
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/usr/local/lib/python3.5/dist-packages/django/views/generic/base.py" in view 
    71.    return self.dispatch(request, *args, **kwargs) 
File "/usr/local/lib/python3.5/dist-packages/django/views/generic/base.py" in dispatch 
    89.   return handler(request, *args, **kwargs) 
File "/usr/local/lib/python3.5/dist-packages/django/views/generic/edit.py" in post 
    215.    return self.form_valid(form) 
File "/opt/project/project/import/views.py" in form_valid 
    16.   form.import_csv() 
File "/opt/project/project/import/forms.py" in import_csv 
    67.   for row in school_csv: 
File "/usr/lib/python3.5/csv.py" in __next__ 
    109.    self.fieldnames 
File "/usr/lib/python3.5/csv.py" in fieldnames 
    96.     self._fieldnames = next(self.reader) 

Exception Type: Error at /import/ 
Exception Value: iterator should return strings, not bytes (did you open the file in text mode?) 

我不相信,我提出了與機會永遠選擇打開文件的模式。我如何能夠在文本模式下打開,以便csv模塊處理它?

我注意到InMemoryUploadedFile有一個file屬性,它似乎很有用,但它是一個io.BytesIO對象。我想我可以做一些魔術,包括手動指定encoding.etc,但我想這是Django會讓事情變得更容易。

解決此問題的最佳方法是什麼?

+0

請將完整的錯誤追溯添加到您的文章! –

+0

@ KlausD.Sorry,完成! –

+0

嘗試以文本模式重新打開該文件:https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.fields.files.FieldFile.open –

回答

3

使用

as_string = self.cleaned_data['data'].read().decode("utf-8") 
school_csv = csv.DictReader(as_string) 

如果預計str

from io import StringIO 
school_csv = csv.DictReader(StringIO(as_string)) 

如果它想StringIO的嘗試。

+0

簡單!爲此歡呼。 –