Как удалить указанную c строку и следующие n строк из текстового файла? - PullRequest
2 голосов
/ 30 марта 2020

Я создаю программу для обновления текстового файла со списком городов:

New York City
New York
USA

Newark
New Jersey
USA

Toronto
Ontario
Canada

Если я хочу удалить детали для Ньюарка, используя скрипт bash, я могу сделать это:

sed -i "/Newark/,+3d" test.txt

И это оставило бы меня со следующим:

New York City
New York
USA

Toronto
Ontario
Canada

Однако я хотел бы сделать это в Python, и у меня возникли проблемы с выяснением как удалить следующие строки, после строки с Newark. Я могу удалить Newark:

with open('test.txt') as oldfile, open('test2.txt', 'w') as newfile:
        for line in oldfile:
            if not "Newark" in line:
                newfile.write(line)

os.remove('test.txt')
os.rename('test2.txt', 'test.txt')

Но это никак не влияет на оставшиеся две строки и создает новый файл, который я затем должен использовать для замены исходного файла.

  1. Как могу ли я go подражать функциональности команды sed с помощью Python?
  2. Можно ли как-либо выполнить редактирование в файле, поэтому мне не нужно создавать и заменять файл каждый раз, когда мне нужно удалить из это?

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

со счетчиком? Вот оно:

with open('test.txt') as oldfile, open('test2.txt', 'w') as newfile:
    skip = 0
    for line in oldfile:
        if "Newark" in line:
            skip = 3
        elif skip > 0:
            skip = skip - 1
        else:
            newfile.write(line)

Редактировать:

Я ответил только на первый вопрос. fileinput поддержка редактирования файлов, пожалуйста, посмотрите здесь: Как искать и заменять текст в файле? Кстати, я бы также рекомендовал на месте , потому что Это не угоняет стандартный вывод

0 голосов
/ 30 марта 2020

Вы можете использовать модуль fileinput для редактирования файлов на месте:

import fileinput
import itertools

skip = 3
with fileinput.input("test.txt", inplace=True) as f:
     for line in f:
         if "Newark" not in line:
             # stdout is redirected to the file
             sys.stdout.write(line)
         else:
             # Skip lines
             next(itertools.islice(f, skip, skip), None)
...