IndexError:列出索引超出范围:我可以理解为什么发生这个错误

我得到了一个错误IndexError:列表索引超出范围。 我想把字典数据放到模型(用户)。 我写了

book2 = xlrd.open_workbook('./data/excel1.xlsx') sheet2 = book2.sheet_by_index(0) for row_index in range(1,sheet2.nrows): rows = sheet2.row_values(row_index) print(rows) user3 = User.objects.filter(user_id=rows[0]) if user3: user3.update(talk1=rows[2],characteristic1=rows[3],talk2=rows[4],characteristic2=rows[5], talk3=rows[6], characteristic3=rows[7],talk4=rows[8], characteristic4=rows[9], talk5=rows[10], characteristic5=rows[11],talk6=rows[12], characteristic6=rows[13], talk7=rows[14], characteristic7=rows[15], talk8=rows[16], characteristic8=rows[17]) 

但是,行的索引数量与每个列表不同

 ['001200cd3eF', 'Tom', 'Hi', 'greeting', 'Goodmorning', 'greeting', 'Bye' 'say good‐bye', '', '', '']['007700ab7Ws', 'Blear', 'How are you', 'greeting', 'Thx', 'Thanks', '', '', ''] 

所以每个列表的索引号是不同的,最大索引是13. models.py是

 Class User(models.Model): talk1 = models.CharField(max_length=500,null=True) talk2 = models.CharField(max_length=500, null=True) talk3 = models.CharField(max_length=500, null=True) talk4 = models.CharField(max_length=500, null=True) talk5 = models.CharField(max_length=500, null=True) talk6 = models.CharField(max_length=500, null=True) talk7 = models.CharField(max_length=500, null=True) talk8 = models.CharField(max_length=500, null=True) characteristic1 = models.CharField(max_length=500,null=True) characteristic2 = models.CharField(max_length=500, null=True) characteristic3 = models.CharField(max_length=500, null=True) characteristic4 = models.CharField(max_length=500, null=True) characteristic5 = models.CharField(max_length=500, null=True) characteristic6 = models.CharField(max_length=500, null=True) characteristic7 = models.CharField(max_length=500, null=True) characteristic8 = models.CharField(max_length=500, null=True) 

如果一个列表没有任何价值,我想把null。如何解决这个问题?我应该写什么?

嗨可以像索引错误列表处理,你可以添加额外的索引与空值

 rows=sheet2.row_values(row_index) append_empty = ['','','','',''] #here mention how many empty index as you need rows = rows + append_empty #goes to your update logic 

与字典不同,没有安全的方法来访问列表中可能不存在的索引。

在你的例子中,我明白,在一些行中,你将不会有索引16,17等…

我build议你看看这个答案: https : //stackoverflow.com/a/5125636/3620496

在你的user3.update()你可以用safe_list_get(rows, index_you_want, 'Default Value you want')replace所有的列表访问。

看看这些答案,他们都可以给出一些答案的元素: 在Python的索引超出范围获取默认值