Python при неправильном завершении цикла, ошибка «Вне диапазона», обнаруженная на последней итерации

#python

#python

Вопрос:

Я буду честен и признаю, что я задал более ранний связанный вопрос, но с тех пор я нашел решение более ранней проблемы и теперь сталкиваюсь с другой проблемой! Я перебираю список для поиска большого текстового файла. Поиск включает в себя получение первой записи списка и использование этой строки (цифр), которая просматривает текстовый файл в поисках этой записи. Скрипт работает нормально до последней итерации / последней записи списка, в результате чего я получаю следующую ошибку в окне cmd…

 2014 Apr 25  09:46:58.884  [35]  0x5245  FFFF Rec rst 4444 A

18.84
2014 Apr 25  09:46:58.902  [81]  0x5245  FFFF Rec rst 4444 A

19.62
2014 Apr 25  09:46:58.944  [2B]  0x5245  FFFF Rec rst 4444 A

16.69
Traceback (most recent call last):
File "C:MEAN_val.py", line 361, in <module>
duta()
File "C:MEAN_val.py", line 120, in duta
for word in [framelist[num]]:
IndexError: list index out of range
Exception RuntimeError: RuntimeError('sys.meta_path must be a list of import hoo
ks',) in <bound method Workbook.__del__ of <xlsxwriter.workbook.Workbook object
at 0x0241F2F0>> ignored
 

Похоже, что функция while num<=len(framelist): не работает и не выходит из цикла, как только число достигает длины списка.

Вот мой частично работающий код…

 for root, subFolders, files in chain.from_iterable(os.walk(path) for path in paths):
        for filename in files:  
            if filename.endswith('.txt'): 

                with open(os.path.join(root, filename), 'r') as fBMA:

                    searchlinesBMA = fBMA.readlines()
                    fBMA.close()



                    num = 0


                    while num<=len(framelist):
                        for i, line in enumerate(searchlinesBMA):
                            for word in [framelist[num]]:
                                if word in line:
                                    keylineBMA = searchlinesBMA[i-2]
                                    Rline = searchlinesBMA[i 10]
                                    Rline = re.sub('[()]', '', Rline)
                                    valueR = Rline.split()
                                    split = keylineBMA.split()
                                    if split[10] == 'A':
                                        print keylineBMA
                                        print valueR[3]
                                        num =1

                                    break
 

Спасибо за чтение,
MikG

Комментарии:

1. Индексы в массивах основаны на 0, тогда len как это количество, т. Е. На основе 1. Измените его на while num < len(framelist):

2. Должно быть while num < len(framelist): указано LT, а не LTE

3. Есть ли причина, по которой вы просто не делаете for frame in framelist: и не избегаете всего этого num ? Также for word in [framelist[num]]: это цикл, который завершается ровно один раз, поэтому он также может быть присваиванием word = framelist[num] , если только эти внешние [] не являются ложными.

4. Спасибо всем за ваш совет. К сожалению, даже после изменения на while num < len(framelist): я все еще получаю ту же ошибку. Обычно я подозреваю, что текстовый файл неверен, но это не так. Кажется, что на одной итерации все еще слишком далеко. Есть ли способ чистого выхода при возникновении ошибки?

5. или, скорее, теперь я получаю эту ошибку cmd, если split [10] == ‘A’: IndexError: список индексов вне диапазона. Похоже, что это все еще похожий случай, когда одна итерация слишком далека

Ответ №1:

Вы можете изменить свой код на:

 while num<len(framelist)
 

потому что длина — это просто количество. Если вы начинаете с нуля и переходите к (включая) длину, вы проходите цикл (длина 1) раз

Ответ №2:

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

 except IndexError:
    pass
continue