POST请求读取CSV文件遇两类报错,寻求解决方案
解决方案
错误原因分析
错误1:ValueError: I/O operation on closed file
调用serializer.save()后,Django的InMemoryUploadedFile对象会被自动关闭,此时再尝试读取request.FILES['file']就会触发该错误。错误2:TypeError: expected str, bytes or os.PathLike object, not InMemoryUploadedFile
open()函数要求传入文件路径字符串,而你直接传了InMemoryUploadedFile对象,类型不匹配导致报错。
可行解决方法
方法1:保存序列化器前读取文件(内存读取)
在serializer.save()之前读取文件内容,避免文件被关闭后无法访问:
def post(self, request): serializer = MosqueFileSerializer(data=request.data) if serializer.is_valid(): # 获取文件对象并重置指针到开头(防止序列化器已读取过内容) file_obj = request.FILES['file'] file_obj.seek(0) # 直接读取类文件对象 df = pd.read_csv(file_obj) # 再执行序列化器保存 serializer.save() # 这里可以处理DataFrame数据 return Response(status=status.HTTP_200_OK)
方法2:读取保存到磁盘的文件(更适合大文件)
如果你的MosqueFile模型将文件保存到本地磁盘,可通过序列化器实例获取文件路径读取:
def post(self, request): serializer = MosqueFileSerializer(data=request.data) if serializer.is_valid(): # 保存序列化器并获取实例 instance = serializer.save() # 通过实例的file字段获取磁盘路径 df = pd.read_csv(instance.file.path) # 处理DataFrame数据 return Response(status=status.HTTP_200_OK)
内容的提问来源于stack exchange,提问作者Halim
相关产品推荐
相关产品推荐

