#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