You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:50:30