IndexError: список индексов вне диапазона.(пытается найти и заменить элементы одного текстового файла другим текстовым файлом - PullRequest
1 голос
/ 27 апреля 2019

начинающий программист на Python здесь.В настоящее время я застрял в написании небольшого Python-скрипта, который откроет исходный txt-файл, найдет конкретное число в этом исходном файле с регулярным выражением (в данном случае 107.5) и в конечном итоге заменит это 107.5 новым номером.новый номер взят из второго текстового файла, который содержит 30 номеров.Каждый раз, когда номер был заменен, скрипт использует следующий номер для его замены.Хотя командная строка, похоже, выдает успешный поиск и замену, после 30-го цикла возникает «IndexError: list index out of range» ...

Мне кажется, что я каким-то образом должен ограничить свой циклчто-то вроде "для меня в диапазоне х".Однако я не уверен, какой список это должен быть и как я могу включить это ограничение цикла в мой текущий код.Любая помощь высоко ценится!

nTemplate = [" "]

output = open(r'C:\Users\Sammy\Downloads\output.txt','rw+')

count = 0

for line in templateImport:
   priceValue = re.compile(r'107.5')

   if priceValue.sub(pllines[count], line) != None:
      priceValue.sub(pllines[count], line)
      nTemplate.append(line)
      count = count + 1
      print('found a match. replaced ' + '107.5 ' + 'with ' + pllines[count] )
      print(nTemplate)

   else:
      nTemplate.append(line)

1 Ответ

0 голосов
/ 27 апреля 2019

Значение IndexError повышается, потому что вы увеличиваете count на каждой итерации цикла, но не добавили верхний предел на основе того, сколько значений содержит список pllines. Вы должны выйти из цикла, когда он достигнет len(pllines), чтобы избежать ошибки.

Другая проблема, которую вы, возможно, не заметили, связана с использованием метода re.sub(). Он возвращает новую строку с соответствующими заменами и не изменяет оригинал.

Если шаблон не существует в строке, он вернет сам оригинал. Таким образом, ваш список nTemplate, вероятно, никогда не содержал никаких замененных строк. Если вам не нужно выполнять какие-либо другие действия, если шаблон был найден в строке, вы можете покончить с условием if (как я сделал в примере ниже).

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

Следующий код должен работать:

nTemplate = [" "]
output = open(r'C:\Users\Sammy\Downloads\output.txt','rw+')

count = 0
priceValue = re.compile(r'107.5')

for line in templateImport:
    if count == len(pllines):
        break
    nTemplate.append(priceValue.sub(pllines[count], line))
    count = count + 1
    print(nTemplate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...