Home > Software design >  pyreadstat expected str, bytes or os.PathLike object, not InMemoryUploadedFile
pyreadstat expected str, bytes or os.PathLike object, not InMemoryUploadedFile

Time:08-02

Trying to make endpoint that can read uploaded .sav (SPSS) file and create model with data from it. For getting data from it I'm using pyreadstat library. But now when I'm trying to run it I have an error expected str, bytes or os.PathLike object, not InMemoryUploadedFile

How I can change this code so pyreadstat can correctly read the given file?

from rest_framework import generics, status
import pandas as pd
import pyreadstat
from rest_framework.response import Response

from .models import Research, Data
from .serializers import FileUploadSerializer, SaveFileSerializer

class UploadFileView(generics.CreateAPIView):
    serializer_class = FileUploadSerializer
    
    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        file = serializer.validated_data['file']
        df, meta = pyreadstat.read_sav(file, user_missing=True)
        json_df = df.to_json(orient='table')
        
        rsch = Research.objects.get(pk=1)
        Data.objects.create(research=rsch, data={})

CodePudding user response:

Change this:

pyreadstat.read_sav(file, user_missing=True)

To this:

pyreadstat.read_sav(file.getvalue(), user_missing=True)

Hope it works.

CodePudding user response:

Django uploaded files are mostly file like, and they only proxy certain methods. See the FileProxyMixin source for more details on specific methods, if you are curious.

To get the uploaded contents, use the read() method:

file = serializer.validated_data['file']
contents = file.read()
df, meta = pyreadstat.read_sav(contents, user_missing=True)

In this case you are getting an InMemoryUploadFile but this could change if Django decides to write to disk due to the upload being too large.

Documentation on django uploaded file objects:

  • Related