使用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
相关产品推荐
相关产品推荐

