Цикл While не выполняется, когда элемент списка отсутствует при поиске текстового файла

#python

#python

Вопрос:

Я надеялся, что кто-нибудь сможет пролить некоторый свет на мою проблему с циклом. Извиняюсь за длинное объяснение!

В принципе, у меня есть скрипт, который собирает различную статистику, но также собирает номера ‘frame’ и помещает их в ‘framelist[ ]’ из огромного текстового файла, как только номера кадров собраны, скрипт продолжает выполнять новый поиск в том же текстовом файле для поиска этих номеров кадров и извлекает еще некоторую полезную информацию. Это немного слишком сложно, но мне пришлось сделать это таким образом, поскольку второй поиск собирает некоторые новые статистические данные на основе первого поиска из строк, расположенных дальше по текстовому файлу. Тем временем я отправляю собранную статистику в Excel с помощью xlsxwriter и выполняю обычную строку = 1 для добавления статистики. Пока это работает, однако становится еще сложнее.

Следующее, что я делаю, это конвертирую список фреймов в ‘целые числа’ и вычитаю 1 из всех записей списка фреймов, затем я конвертирую обратно в новый список строк ‘framelist1[ ]’ с новыми записями (с вычетом ‘1’). Я делаю это, чтобы найти номер предыдущего кадра. Затем я запускаю другой поиск, чтобы собрать аналогичную статистику по предыдущему номеру кадра. Пока все в порядке …. пока не найден «вычтенный» номер кадра. Если новый ‘вычитаемый’ фрейм отсутствует в текстовом файле, скрипт python зависает. Что я очень хочу сделать, так это проигнорировать отсутствующий фрейм, если он отсутствует в текстовом файле, и просто поместить запись ‘Null’ или ‘Skip’ в файл Excel. Я поиграл с различными функциями try: и except:, но все еще безуспешно, скрипт все еще зависает. Я опубликовал свой цикл while ниже, когда он обрабатывает framelist1[ ]. Я оставил в коде попытки ‘Skip’ и ‘Null’, чтобы показать, что я пробовал до сих пор. Прошу прощения за сложные методы, я все еще изучаю Python, и я знаю, что есть лучший способ сделать это, избегая многократных поисков, но делая это таким образом, я знаю, где я нахожусь в сценарии, когда что-то идет не так!

вот цикл…

         framelist = map(int, framelist)
        framelist[:] = [x - 1 for x in framelist]

        framelist1 = map(lambda x: str(x), framelist)
        framelist = []
        #framelist1 = ''(str(e) for e in framelist)

        num = 0

        while num < len(framelist1):
            for i, line in enumerate(searchlinesBMA):
                try:
                    word = framelist1[num]
                    print word
                    if word in line:
                        keylineBMA = searchlinesBMA[i-2]
                        Rline = searchlinesBMA[i 10]
                        Rline = re.sub('[()]', '', Rline)
                        valueR = Rline.split()
                        split = keylineBMA.split()
                        try:
                            if split[10] == 'A':
                                worksheetFILTERA.write(row_numBMAA1,4,valueR[3], decimal_format)
                                row_numBMAA1 =1
                                num =1
                        except:
                            worksheetFILTERA.write(row_numBMAA1,4,'SKIP')
                            row_numBMAA1 =1
                            num =1
                            break
                    elif word != framelist1[num]:
                        worksheetFILTERA.write(row_numBMAA1,4,'NULL')
                        row_numBMAA1 =1
                        num =1
                        break
                except:
                    pass
  

Спасибо,
MikG

Ответ №1:

Вы не увеличиваете значение num в except инструкции внизу вашего примера. Итак, если это ошибка в начале try блока, у вас есть бесконечный цикл.

Вы не увеличиваете, num если в нем ничего нет searchlinesBMA .

 while num < len(framelist1):
    # if searchlinesBMA is empty here you dont increment `num`
    for i, line in enumerate(searchlinesBMA):
         #Your code..

    #increment num needed here?
    if not searchlinesBMA:
        num  = 1
    else:
        for i, line in enumerate(searchlinesBMA):
            # Your code..
  

Возможно, стоит печатать ошибки, обнаруженные except. Может дать вам лучшее представление о том, что происходит не так:

 except Exception as e:
    print(e)
  

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

1. Спасибо за ваш ответ Shadow9043. Я вижу первый пункт, который вы упомянули, где я не увеличиваю num в except: path , хотя при этом скрипт все еще зависает. С вашим другим предложением, как бы мне увеличить num в searchlinesBMA, я думал, что это будет описано в except: path? Спасибо, MikG

2. Посмотрите выше. Просто обновил мой ответ. Посмотрите, поможет ли это вам.

3. Спасибо за вашу помощь Shadow9043