这是我的代码。我想导入csv并通过模型将其保存到数据库。
class DataInput(forms.Form):
file = forms.FileField(label="Select CSV file")
def save(self, mdl):
records = csv.reader(self.cleaned_data["file"].read().decode('utf-8'), delimiter=',')
if mdl=='auction':
auction = Auction()
for line in records:
auction.auction_name = line[0]
auction.auction_full_name = line[1]
auction.auction_url = line[2]
auction.is_group = line[3]
auction.save()
现在,它会抛出以下错误。
Exception Type: IndexError
Exception Value: list index out of range
csv文件
RTS,Rapid Trans System,www.rts.com,TRUE
ZAA,Zelon Advanced Auton,www.zaa.info,FALSE
真的卡住了。请帮忙。
答案 0 :(得分:0)
首先,完整的堆栈跟踪应该准确显示错误的位置。给Django --traceback
参数,例如: ./manage.py --traceback runserver
。
正如Burhan Khalid在10分钟前提到的那样,你错过了csv文件中的第5列(索引4),这就是错误的根源。
答案 1 :(得分:0)
使用.read()
读取文件后,您将传入完整的字符串 - 这就是每行都是单个字符的原因。
您需要传递整个文件对象,而不是先读取它:
records = csv.reader(self.cleaned_data["file"], delimiter=',')
如果您需要先解码,那么您最好自己浏览一下文件:
for line in self.cleaned_data['file'].read().decode('utf-8').split('\n'):
if line.strip():
try:
name, full_name, url, group = line.split(',')
except ValueError:
print('Invalid line: {}'.format(line))
continue
i = Auction()
i.auction_name = name
i.action_full_name = full_name
i.auction_url = url
i.is_group = group
i.save()