2016-06-07 2 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

Не переходите к 'read()' при переходе на 'import_contents'. –

+1

Возможный дубликат [Неожиданные результаты, загружающие объект загрузки файла Django в модуль CSV Python] (http://stackoverflow.com/questions/1396126/unexpected-results-feeding-django-file-upload-object-to-python-csv- модуль) –

+0

@ DanielRoseman Это сработало, спасибо! Теперь мне нужно иметь дело с правильным чтением .csv. Когда я использую строку [0], она возвращает целую строку, а не столбец 0. Но это то, что мне нужно выяснить сейчас. –

ответ

3

Это ваша проблема.

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

csv.reader() ожидает файл как объект, а не его содержание.

This может быть определенно как связанный ответ.

+0

Как Даниэль прокомментировал мой вопрос при вызове без работы .read(). Теперь я работаю с импортом. Когда я вызываю строку [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 = '"') –

Смежные вопросы