Django csv上传代码有什么问题?

时间:2015-02-19 06:49:22

标签: django csv

这是我的代码。我想导入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

真的卡住了。请帮忙。

2 个答案:

答案 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()