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

Django中CSV上传解析报错:期望路径对象而非InMemoryUploadedFile

Django文件上传报错:expected str, bytes or os.PathLike object, not InMemoryUploadedFile

嘿,作为刚上手Django同时重拾Python的同学,碰到这个问题真的很常见!先给你吃个定心丸——这个错误和重定向完全没关系,问题出在你对Django上传文件对象的处理逻辑上。

问题原因

你可能以为request.FILES["csv_file"]是普通的文件对象或者文件路径,但实际上Django上传的文件是InMemoryUploadedFile类型的对象,它的底层是二进制流,而csv.reader默认期望的是文本模式的类文件对象(或者文件路径字符串),直接把InMemoryUploadedFile传进去,就会触发类型不匹配的报错。

修复方案

只需要把上传的二进制流转换成文本模式的流就行,步骤如下:

  1. 先导入io模块里的TextIOWrapper(用来处理文本流转换)
  2. 修改handle_files函数,对上传的文件对象做一层包装

修改后的完整代码如下:

import csv
from io import TextIOWrapper
from django.shortcuts import render, HttpResponseRedirect, reverse

def upload_csv(request): 
    if "GET" == request.method: 
        return render(request, "portal/csvupload.html") 
    csv_file = request.FILES["csv_file"]
    handle_files(csv_file) 
    return HttpResponseRedirect(reverse("portal:csvupload")) 

def handle_files(csvfile):
    # 将二进制流包装为文本模式的流,编码根据你的CSV文件实际情况调整(比如utf-8-sig处理带BOM的UTF-8文件)
    csv_text_stream = TextIOWrapper(csvfile.file, encoding='utf-8')
    csv_reader = csv.reader(csv_text_stream) 
    for line in csv_reader: 
        print(line)

额外提示

如果你的CSV文件是Windows系统下保存的UTF-8格式,可能会带有BOM(字节顺序标记),这时候把编码改成utf-8-sig就能避免首行出现\ufeff这类奇怪的字符啦。

内容的提问来源于stack exchange,提问作者Tahu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:03:10