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

使用CSV文件填充Django模型时出现'str' object has no attribute 'get'错误

解决Django中用CSV文件填充模型时出现的'str' object has no attribute 'get'错误

Hey,我看你这段代码里的问题出在处理上传的CSV文件的方式上。你直接用open(csvfile,"rt")去打开request.FILES['myfilebase']是不对的,这就是导致'str' object has no attribute 'get'错误的根源。

问题原因分析

Django中request.FILES获取到的是InMemoryUploadedFile(小文件存在内存)或TemporaryUploadedFile(大文件存在临时目录)对象,不是本地文件的路径字符串。当你调用open(csvfile, "rt")时,Python会自动把这个文件对象转换成它的文件名(字符串),但csv.reader需要的是一个文件流对象,而非字符串,后续操作自然就抛出了类型错误。

修正后的代码

其实Django的上传文件对象本身就支持直接作为文件流读取,不需要用open()重新打开。你可以直接把它转换成文本模式后传给csv.reader,修正后的代码如下:

import csv
from django.http import HttpResponse

if form.is_valid():
    print("form1 valid")
    csvfile = request.FILES['myfilebase']
    print(csvfile)
    try:
        # 方式1:将二进制内容解码为文本并按行拆分
        csv_content = csvfile.read().decode('utf-8').splitlines()
        my_data = csv.reader(csv_content)
        
        # 方式2:Django 3.0+ 支持直接用open()获取文本流
        # my_data = csv.reader(csvfile.open('r'))
        
        for row in my_data:
            print(row)
            # 这里添加创建Django模型实例的逻辑,比如:
            # MyModel.objects.create(field_name1=row[0], field_name2=row[1])
    except Exception as e:
        msg = f"Cannot process file - is it CSV? Error: {str(e)}"
        print(msg)
        return HttpResponse(msg, status=400)
else:
    print("invalid form")

额外注意事项

  • 避免使用空的except:,捕获具体的异常类型(比如csv.Error、UnicodeDecodeError),能更精准地定位问题
  • 如果CSV文件使用了非UTF-8编码(比如GBK),记得把decode('utf-8')改成对应的编码格式
  • 处理大文件时,推荐用方式2的csvfile.open('r'),它会逐行读取,避免一次性加载大文件到内存中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:02:00