Python脚本问题

时间:2016-03-24 14:01:04

标签: python bluetooth openpyxl pybluez

我的代码存在问题,我得到了输出:

  

追踪(最近的呼叫最后):
  文件“1stHour.py”,第48行,中   ws1.cell(column = 1,row = i,value =“%s”%blue_student_list [i])
  IndexError:列表索引超出范围`

# coding=utf:8
from pythonzenity import Message
from openpyxl.styles import PatternFill
from openpyxl import Workbook
import bluetooth
import time



def student_check(index):
    result = bluetooth.lookup_name(blue_address_list[index], timeout=3)
    if (result is not None):
        return True
    else:
        return False

blue_student_list = ['Name', 'Name2']
blue_address_list = ['Address', 'Address2']


redFill = PatternFill(start_color='FF0000', end_color='FF0000', fill_type='solid')
greenFill = PatternFill(start_color='00FF00', end_color='00FF00', fill_type='solid')


for i in range(0, len(blue_address_list)):

    i = i + 1

    ws1.cell(column=1, row=i, value="%s" % blue_student_list[i])
    if (student_check(i)):
       ws1.cell(column=2, row=i, value="%s" % "Present").fill = greenFill
    else:
       ws1.cell(column=2, row=i, value="%s" % "Absent").fill = redFill


Message(title="Attendance Checker",text="You can now open the Excel Document on your Desktop", timeout=3000)

我有这个工作,但忘了保存它,所以我没有正确的方式,我以前在这里已经。我该怎么做才能防止此错误?我觉得我忘记了某些事情或在i = i + 1部分写了我的代码。

2 个答案:

答案 0 :(得分:1)

执行此操作时:

for i in range(0, len(blue_address_list)):

没有必要这样做:

i = i + 1

这样做会导致你看到的bug类型。

您似乎正在这样做,因为您使用的库使用基于1的索引而不是基于0的Python列表。但是当你这样做时,你仍然使用(1太高)i索引到列表中:

blue_student_list[i]

因此,不是第二次递增i,而是将一个更高的值传递给需要它的东西:

ws1.cell(column=1, row=i+1, value="%s" % blue_student_list[i])

和其他对ws1.cell的调用类似。

这对于Python库来说是不寻常的,至少可以说,所以它可能保证在你第一次使用row=i+1之前发表这样的评论:

# Need row=i+1 because openPyXML uses 1-based indexing

答案 1 :(得分:1)

行和列在openpyxl中是1索引的,因此ws['A1']对应ws.cell(column=1, row=1)

IndexError几乎肯定来自blue_student_list[i]查找。最好使用额外的一行来获得价值并避免使用"%s"格式化,因为这里完全没有必要。

for idx, value in enumerate(blue_student_list, start=1):
    ws1.cell(column=1, row=idx, value=value)