Django REST framework - разбор загруженного файла csv

Я настроил конечную точку фреймворка Django REST, которая позволяет мне загрузить файл csv.

Serializers.py выглядит следующим образом:

from rest_framework import serializers

class UploadSerializer(serializers.Serializer):
    file_uploaded = serializers.FileField()
    class Meta:
        fields = ['file_uploaded']

В моем файле views.py я пытаюсь прочитать данные из загруженного csv следующим образом:

class UploadViewSet(viewsets.ViewSet):
    serializer_class = UploadSerializer

    def create(self, request):
        file_uploaded = request.FILES.get('file_uploaded')
    
        with open(file_uploaded, mode ='r')as file:
            csvFile = csv.reader(file)
            for lines in csvFile:
                print(lines)

Я получаю следующую ошибку:

... line 37, in create
    with open(file_uploaded, mode ='r') as file:
TypeError: expected str, bytes or os.PathLike object, not InMemoryUploadedFile

Я проверил тип() файла_uploaded и он равен <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>

Как я могу прочитать этот файл в словарь или фрейм данных, чтобы я мог извлечь из него нужные мне данные?

Когда вы делаете request.FILES.get('file_uploaded'), он возвращает InMemoryUploadedFile, который является оберткой вокруг объекта файла. Вы можете получить доступ к объекту файла, используя атрибут file.

file_uploaded # <InMemoryUploadedFile: xxx (xxx/xxx)>
file_object = file_uploaded.file

Затем этот файл_объект может быть открыт.

Объект InMemoryFileObject можно использовать практически так же, как и открытый файл, поэтому открывать его не нужно.

def create(self, request):
    file_upload = request.FILES.get("file_uploaded")
    csvFile = csv.reader(file_upload)
    for line in csvFile:
        print(line)

Здесь есть хорошая информация о работе с файлами в django.

https://docs.djangoproject.com/en/4.1/topics/http/file-uploads/#handling-uploaded-files-with-a-model

Вернуться на верх