У меня есть скрипт, который ищет в текстовом файле ключевое слово (например: 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
Как действовать, не повторяя первую строку? Думаю, это потому, что я позже записываю «строчку», а они считают строчку неизменной ...