Добавить текст за 2 строки до совпадения в python - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь найти «AAXX» и добавить слово «Hello» двумя строками выше:

Input:
111
222
AAXX
333
444
AAXX
555
666
AAXX

Output: 
Hello 
111
222
AAXX
Hello
333 
444
AAXX
Hello
555
666
AAXX

Мне удалось вставить только одну «Hello» двумя строками перед первым «AAXX».используя приведенный ниже код, но я не могу сделать так, чтобы он просматривал файл и делал то же самое для всех совпадений «AAXX».

import os

with open(os.path.expanduser("~/Desktop/test.txt"), "r+") as f:
    a = [x.rstrip() for x in f]
    for i, item in enumerate(a):
        if item.startswith("AAXX"):
            a.insert(i-2,"Hello")
            break
        index += 1
    # Go to start of file and clear it
    f.seek(0)
    f.truncate()
    # Write each line back
    for line in a:
        f.write(line + "\n")

Пока я получаю:

Hello
111
222
AAXX
333
444
AAXX
555
666
AAXX

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Можете ли вы попробовать следующее:

with open('test.txt', 'r') as infile:
    data = infile.read()
final_list = []
for ind, val in enumerate(data.split('\n')):
    final_list.append(val)
    if val == 'AAXX':
        final_list.insert(-3, 'HELLO')
# save the text file
with open('test.txt', 'w') as outfile:
    data = outfile.write('\n'.join(final_list))

Выход:

HELLO
111
222
AAXX
HELLO
333
444
AAXX
HELLO
555
666
AAXX
0 голосов
/ 28 марта 2019
def p(a):
    r = []
    for i, item in enumerate(a):
        if item.startswith("AAXX"):
            r.append(i)
    for i in reversed(r):
        a.insert(i-2,"HELLO")
    return(a)

Вы можете обернуть это, как вы хотите иметь дело с входами / выходами. Вам нужно исправить случай, когда «AAXX» встречается в первых двух элементах, так как вы не определили, какое поведение вы там хотите. Ключевая проблема заключается в том, что изменение списка во время его итерации является плохой практикой, в частности, более поздние индексы могут быть отключены, поскольку вы вставили более ранние «ПРИВЕТ». Возможное решение состоит в том, чтобы отслеживать все индексы вставки, а затем выполнять вставки в обратном порядке, потому что вставка позже в список не влияет на более ранние индексы.

...