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传进去,就会触发类型不匹配的报错。
修复方案
只需要把上传的二进制流转换成文本模式的流就行,步骤如下:
- 先导入
io模块里的TextIOWrapper(用来处理文本流转换) - 修改
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
相关产品推荐
相关产品推荐

