Django后端读取用户上传CSV文件遇FileNotFoundError报错
解决FileNotFoundError:读取Django上传CSV文件的正确方式
问题原因
你用default_storage.url(file_name)获取的是Web访问URL,不是服务器本地的文件系统路径,而pd.read_csv()需要的是本地磁盘的真实路径,所以会报文件找不到的错误。
正确实现方式
方式1:直接读取上传的文件流(推荐,无需保存文件)
既然不想将文件存入数据库,甚至可以不用把文件保存到磁盘,直接读取上传的文件对象:
def view_submit_form(request): if request.method == 'POST': text = request.POST.get('smstext') csv_file = request.FILES['csv_file'] # 直接用UploadedFile对象读取,无需保存到磁盘 df = pd.read_csv(csv_file) # 后续对df进行业务处理... return render(request, 'SubmitForm/form.html')
方式2:临时保存到本地后读取(若需临时留存文件)
如果确实需要临时保存文件到服务器本地,用default_storage.path()获取本地文件路径,而不是url():
from django.core.files.storage import default_storage def view_submit_form(request): if request.method == 'POST': text = request.POST.get('smstext') csv_file = request.FILES['csv_file'] # 保存文件到默认存储位置 file_name = default_storage.save(csv_file.name, csv_file) # 获取本地文件系统的真实路径 local_file_path = default_storage.path(file_name) df = pd.read_csv(local_file_path) # 后续对df进行业务处理... # 若无需留存文件,处理完成后可删除 # default_storage.delete(file_name) return render(request, 'SubmitForm/form.html')
注意事项
- 确保Django项目配置了正确的
MEDIA_ROOT和MEDIA_URL,default_storage默认使用文件系统存储,对应MEDIA_ROOT目录。 - 方式1更高效,避免了额外的磁盘IO操作,适合仅需一次性读取处理的场景。
内容的提问来源于stack exchange,提问作者ImThePeak
相关产品推荐
相关产品推荐

