Как читать текст из определенного мира в тексте, укажите следующий пробел в текстовом файле в Python - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть текстовый файл, который содержит имена коммутаторов и порт для каждого коммутатора, например, вот так:

switch 1
[1] server 1
[2] server 2
[3] server 3
[4] server 4

 some text that no one need 

 switch 2
 [1] server 1
 [2] server 2
 [3] server 3
 [4] server 4

Теперь я хочу разделить текст там, где разделение начинается, когда его переключатель чтения 1, и останавливается, когда читается пробел или пустая строка, и проблема заключается в том, что у меня есть какой-то текст, который мне не нужен в любом мидделе. помогите пожалуйста

Спасибо за продвинутый

1 Ответ

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

Если я правильно вас читаю, вы хотите сохранить все строки, которые:

  1. Начните со слова switch
  2. Следовать после строки, начинающейся с switch, но до следующей пустой строки

Это не так уж сложно:

keptlines = []
with open(myfile) as f:
    for line in f:
        if line.startswith('switch '):
            keptlines.append(line)
            for line in f:  # Continue iterating f for additional lines to keep
                if not line.rstrip():
                    break  # We hit an empty line, return to looking for switch
                keptlines.append(line)

Существуют вариантные подходы, если вы хотите, чтобы различные переключатели были разделены (например, dict, обозначенный номером переключателя, с list s строк в качестве значений), но это основной шаблон.

Просто для полноты, существует вариантный подход для упрощения кода с использованием itertools, добавление импорта в начало файла from itertools import takewhile и замена:

            for line in f:  # Continue iterating f for additional lines to keep
                if not line.rstrip():
                    break  # We hit an empty line, return to looking for switch
                keptlines.append(line)

только с:

            keptlines.extend(takewhile(str.rstrip, f))

Подобный подход может подтолкнуть внешний цикл к вызову dropwhile, но это будет довольно сложно (вы не можете удалить оболочку dropwhile без потери данных, и вам придется перематывать ее для каждого нового switch блок), так что, вероятно, оно того не стоит.

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