2016-03-04 4 views
0
import xlrd 


def get_data(a): 
    aa = worksheet.cell(a, 0).value 
    bb = int(worksheet.cell(a, 2).value) 
    cc = worksheet.cell(a, 3).value  

    return([aa,bb,cc]) 

workbook = xlrd.open_workbook('d:/test.xls') 
worksheet = workbook.sheet_by_index(0) 

c = 1 
objs = [] 

while worksheet.row(worksheet.nrows-1): 
    f = get_data(c) 
    objs.append(f) 
    c = c + 1 

print(objs) 

Я получаю следующее сообщение об ошибке:ошибка python3 с помощью xlrd (я не могу добавить список, потому что ошибка)

Traceback (most recent call last): 
File "D:\test.py", line 20, in <module> 
    f = get_data(c) 
File "D:\test.py", line 6, in get_data 
    aa = worksheet.cell(a, 0).value 
File "C:\Python34\lib\site-packages\xlrd\sheet.py", line 399, in cell 
    self._cell_types[rowx][colx], 
IndexError: list index out of range 
+0

Лучше всего опубликовать всю трассировку стека. Часть, которую вы опубликовали, не показывает, в какой строке вашего кода была поднята ошибка. Я не думаю, что проблема связана с списком (и, BTW, pickle не имеет отношения к чему-либо, показанному здесь). Вероятно, на вашем листе нет данных для столбцов 0, 2 или 3 одного (или более) строк. – dsh

+0

@dsh есть данные для столбца 0, 2 или 3 все, я удаляю pickle. но такая же ошибка –

ответ

0

Я вижу проблему сейчас. Ошибка возникает, когда вы вызываете get_data(c), и в этой функции он вызывает worksheet.cell(a, 0). При доступе к столбцу 0 какой-либо строки (номер строки не указан в сообщении об ошибке) индекс строки или столбца (или и того и другого) больше, чем существующие данные.

Поскольку номер столбца, 0, является константой, тем больше вопрос, в какой строке это ошибка? Один из способов приблизиться к отладке заключается в том, чтобы поймать исключение и зарегистрировать номер строки. Например:

try: 
    get_data(c) 
except Exception as err: 
    print("Failed to get data for row", c) 
    raise 

Это изменение скажет вам, какая строка терпит неудачу.

При чтении кода более внимательно, чтобы определить источник номера строки, я вижу, что ваш цикл никогда не заканчивается.

Если объект строки, который вы извлекаете, является «правдивым», тогда цикл будет повторяться. Вместо этого вы хотите проверить, достиг ли число строк в листе строк в файле. Самый естественный способ сделать это - цикл «для».

for c in range(1, worksheet.nrows+1): 
    f = get_data(c) 
    objs.append(f) 

Это, естественно, делает петлю конечной, а также устраняет две дополнительные строки кода у вас нет (нет необходимости инициализировать или приращение с).

+0

я ОБМЕН просто следовать вашему сопутствующей –

+0

'импорта xlrd Защиту get_data (а): возвращения ([worksheet.cell (а, 0) .value]) Учебного пособия = xlrd.open_workbook (» д: /test.xls') = лист workbook.sheet_by_index (0) с = 1 OBJS = [] для с в диапазоне (1, worksheet.nrows + 1): попытка: F = get_data (c) objs.append (f) за исключением исключения как err:печать ("Не удалось получить данные для строки", в) поднять печати (OBJS) ' –

+0

' Не удалось получить данные для строки 1 Traceback (самый последний вызов последним): Файл «D: \ тест .py ", строка 17, в f = get_data (c) Файл« D: \ test.py », строка 7, в get_data return ([worksheet.cell (a, 0) .value]) Файл «C: \ Python34 \ lib \ site-packages \ xlrd \ sheet.py», строка 399, в ячейке self._cell_types [rowx] [colx], IndexError: индекс списка вне диапазона' –

 Смежные вопросы

  • Нет связанных вопросов^_^