-2

次の出力を取得するコードに問題があります。

トレースバック (最新の最後の呼び出し): ws1.cell(column=1, row=i, value="%s" % blue_student_list[i])
内のファイル "1stHour.py"、48行目 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何かを忘れているか、コードの一部に書き込んでいるような気がします。

4

2 に答える 2

1

行と列は openpyxl で 1-index であるため、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)
于 2016-03-24T17:31:16.963 に答える
1

これを行う場合:

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

これも行う必要はありません。

i = i + 1

そうすることで、表示されるタイプのバグが発生します。

使用しているライブラリは、Python リストのように 0 ベースではなく 1 ベースのインデックスを使用しているため、これを行っているようです。ただし、これを行うと、まだ (1 too high)iを使用してリストにインデックスを付けています。

blue_student_list[i]

したがって、もう一度インクリメントiする代わりに、必要なものに 1 より大きい値を渡します。

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
于 2016-03-24T14:20:52.190 に答える