Django导入CSV文件到数据库时遭遇‘iterator should return strings, not bytes’错误求助
Django导入CSV文件到数据库时遭遇‘iterator should return strings, not bytes’错误求助
嘿,我看到你在Django导入CSV到数据库时碰到了这个「iterator should return strings, not bytes」的错误,我来帮你解决这个问题!
先把你的问题场景和相关代码整理出来,方便排查:
遇到的错误提示
iterator should return strings, not bytes (the file should be opened in text mode)
我的视图函数代码
def import_excel(request): if request.method == 'POST': person_resource = PersonResource() dataset = Dataset() new_person = request.FILES['myfile'] if not new_person.name.endswith('csv'): messages.info(request,'Wrong format') return render(request,'upload.html') imported_data = dataset.load(new_person.read(),format='csv') for data in imported_data: value = Person( data[0], data[1], data[2] ) value.save() return render(request,'upload.html')
我的Person模型代码
class Person(models.Model): name = models.CharField(max_length=200) marks = models.IntegerField() def __str__(self): return self.name
问题原因&解决方案
问题的核心很简单:request.FILES['myfile'].read()返回的是字节流(bytes类型),但dataset.load()方法需要的是文本字符串(str类型),两者类型不匹配就抛出了这个错误。
给你两种简单的解决办法:
方法1:解码字节流为字符串
把导入数据的那一行修改为:
imported_data = dataset.load(new_person.read().decode('utf-8'), format='csv')
这里用decode('utf-8')把字节转换成UTF-8编码的字符串,如果你的CSV文件用的是其他编码(比如gbk),替换成对应编码即可。
方法2:直接以文本模式打开文件
也可以跳过read(),直接用文本模式打开上传的文件,这样读取出来的内容就是字符串:
imported_data = dataset.load(new_person.open('r'), format='csv')
两种方法都能解决问题,你可以根据自己的习惯选择~
备注:内容来源于stack exchange,提问作者swamy patel
相关产品推荐
相关产品推荐

