Просмотр предыдущего индекса в цикле Python for - PullRequest
0 голосов
/ 09 июля 2020

У меня есть скрипт, который ищет в текстовом файле ключевое слово (например: APPLE), и если true , он меняет другую часть (например: «00», «01» или «02») на "22" того же самого TXT в той же строке, в качестве примера, я последую этими тремя строками:

INPUT: 123456 БАНАН 00 SP 123457 ЯБЛОКО 01 RJ 123458 PEAR 02 MG

запуск скрипта

ВЫХОД: 123456 БАНАН 00 SP 123457 ЯБЛОКО 22 * ​​1014 * RJ 123458 PEAR 02 MG

Эти три строки являются частью одного и того же «заголовка».

Код, который это уже делает (количество позиций не отражает реальности, это просто пример, но в фактическом файле у них есть макет с фиксированными позициями):

import shutil, tempfile

# reads from file and writes to another temporary file
with open ('teste.txt', 'r') as file, \
     tempfile.NamedTemporaryFile ('w', delete = False) as out:
    for line in file:
        code = line [07:14] # APPLE SEARCH
        
        if code == 'APPLE':
           print ("FOUND, CODE:" + code)
           line = line [: 14] + "22" + line [16:] # reassemble the line with the change
        else:
           print ("NOT FOUND, CODE:" + code)

        out.write (line) # write to temporary file

# move the temporary file to the original
shutil.move (out.name, 'test.txt')

Однако в этом решении есть проблема logi c, потому что моя реальность такова, что если на вторая строка Я нахожу «ЯБЛОКО», я не буду менять ту же строку, но в верхней строке, которая принадлежит «БАНАНУ» и что мой код прошел. Итак, результат, который я ожидаю, если скрипт завершится, будет:

123456 BANANA 22 * ​​1027 * SP 123457 ЯБЛОКО 01 RJ 123458 PEAR 02 MG

Решение, о котором я думаю: создайте список с именем "exit" и увеличьте его, поэтому, когда мне нужно получить одну позицию, я просто выполняю [ exit - 1] , но не работает ... в файл сохраняются только те строки, которые были изменены, и это потому, что я перезаписываю свою текущую «строку» моей предыдущей строкой, но я не Я не знаю, как это сделать. Вот мое решение, которое не работает:


import shutil, tempfile

# reads from file and writes to another temporary file
exit = []
with open ('teste.txt', 'r') as file, \
     tempfile.NamedTemporaryFile ('w', delete = False) as out:
    
    for i, line in enumerate (file):
        code = line [07:14]
        
        if code == 'APPLE':
           print ("FOUND, CODE:" + code)
           line = exit [i - 1]
           line = line [: 14] + "22" + line [16:] # reassemble the line
           
        else:
           print ("NOT FOUND, CODE:" + code)
           
        out.write (line) # write to temporary file
        exit.append (line)
        
# move the temporary file to the original
shutil.move (out.name, 'test.txt')

Наконец, мой вопрос: как мне «вернуть» позицию в индексе ПЕРЕД повторной сборкой строки в python для?

ОБНОВЛЕНИЕ

Я последовал некоторым советам и создал список со всеми моими строками, чтобы можно было вернуться, когда это необходимо, поэтому я сделал это:

import shutil, tempfile

outLines = []
# reads from file and writes to another temporary file
with open ('teste.txt', 'r') as file, \
     tempfile.NamedTemporaryFile ('w', delete = False) as out:
        for i, line in enumerate (file):
            exit.append (line)
            code = line [14:23]
            if code == 'APPLE':
               print ("FOUND, CODE:" + code)
               outLines [i] = outLines [i-1] [:14] + "22" + outLines [i-1] [16:] # reassemble the line
               lineout = outLines [i]
               out.write (lineout)
            else:
               print ("NOT FOUND, CODE:" + code)
               
            out.write (line) # write to temporary file
# move the temporary file to the original
shutil.move (out.name, 'test.txt')

проблема теперь в том, что мой код повторяет первую строку, например, мой вывод теперь примерно такой:

123456 BANANA 01 SP 123456 БАНАН 22 * ​​1049 * SP 123457 ЯБЛОКО 01 RJ 123458 PEAR 02 MG

Как действовать, не повторяя первую строку? Думаю, это потому, что я позже записываю «строчку», а они считают строчку неизменной ...

1 Ответ

0 голосов
/ 09 июля 2020

Ваша проблема в том, что вы пишете каждую строку так, как вы с ней сталкиваетесь. Когда вы найдете APPLE, вы уже записали строку BANANA в выходной файл.

Наиболее простое изменение в вашем коде - сохранить все ваши строки в exit, пока вы не прочитаете весь входной файл. Когда вы найдете APPLE, измените предыдущий элемент exit (обратите внимание, что ваш текущий код этого не делает). Когда вы дойдете до конца входного файла, затем запишите выходной файл из exit.

ПРИМЕЧАНИЕ: вы должны изменить имя переменной exit, так как это имя встроенная функция.

Сможете ли вы обработать логи c отсюда?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...