Выводить следующие строки после нахождения подстроки в строке (string) до тех пор, пока не будет выполнено условие

#python #python-3.x

#python #python-3.x

Вопрос:

Я хотел бы:

  1. считывать строки из файла
  2. найти строку с указанным текстом ( ## Required reading )
  3. выводить следующие строки после строки с определенным текстом, если они содержат звездочку ( * ) в начале строки
  4. если в следующей строке больше нет строк со звездочкой ( * ) (или другой строки), она должна прекратиться

Итак, что я сделал до сих пор, это прочитал файл, получил строки и нашел конкретный текст, в данном случае это ## Required reading

 with open(file, "r") as input:
  for line in input:
    if '## Required reading' in line:
      print(next(input)) 
  

При этом будет выведена следующая строка, но это все. Что мне нужно, так это распечатать все следующие строки, если они содержат звездочку (*) в начале строки. Если нет, он должен прекратить печать строк.

Я думал о некотором while условии, но я не мог понять, как

Вот как это выглядит в исходном файле:

 ## Required reading
* [5.5. Dictionaries](https://docs.python.org/3/tutorial/datastructures.html#dictionaries)
* [5.6. Looping Techniques](https://docs.python.org/3/tutorial/datastructures.html#looping-techniques)
* [5.7. More on Conditions](https://docs.python.org/3/tutorial/datastructures.html#more-on-conditions)
* [5.8. Comparing Sequences and Other Types](https://docs.python.org/3/tutorial/datastructures.html#comparing-sequences-and-other-types)
* [5.4. Sets](https://docs.python.org/3/tutorial/datastructures.html#sets)
* [Set Types — set, frozenset](https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset)
* [7.2. Reading and Writing Files](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files)
* [7.2.1. Methods of File Objects](https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects)
* [8.4. The try statement](https://docs.python.org/3/reference/compound_stmts.html#the-try-statement)
* [8.5. The with statement](https://docs.python.org/3/reference/compound_stmts.html#the-with-statement)
* [Open](https://docs.python.org/3/library/functions.html#open)
* [file object](https://docs.python.org/3/glossary.html#term-file-object)
  

но файл также содержит другие разделы, не только ## Required reading section, и я хотел бы получить только ссылки со звездочкой ( * ) из этого раздела и распечатать их.

Комментарии:

1. Каков размер файла? Потому что лучший способ — загрузить файл в переменную. Затем вы можете использовать регулярное выражение (модуль re ) или, по крайней мере, более простой цикл работа со строкой.

2. @s3n0 Я не согласен, поскольку для этого потребуется два прохода (один проход для чтения файла и второй проход для извлечения информации), в то время как вы можете выполнить задачу за один проход.

3. Итак, по вашему мнению, операции с оперативной памятью быстрее, чем операции с жестким диском? 🙂 Да, конечно, почти каждая операционная система и языковой интерпретатор теперь используют буфер при чтении с диска. Да, конечно, физические жесткие диски больше не используются, и есть только твердотельные накопители. Но я должен рассчитывать на все в работе :). Я вырос на ассемблере :). Для меня по-прежнему будет верно, что RAM = время доступа в наносекундах и HDD = время доступа в миллисекундах. Аналогичная проблема возникает с re модулем — в зависимости от того, где и как вы его используете. Итак, я спросил об объеме данных. Если размер файла составляет 100 МБ, это может стать большой проблемой.

4. @s3n0 Я надеюсь, вы уже знаете, что сначала нужно прочитать все с диска, чтобы сохранить это в оперативной памяти. Вы просто добавляете больше «наносекунд» к «миллисекундам», где вы можете выполнить in за «миллисекунды».

Ответ №1:

Попробуйте это:

 with open(file, "r") as input:
  is_required = False
  for line in input:
    if is_required and line.startswith("*"):
      print(line)
    else:
      is_required = '## Required reading' in line
  

В последней строке будет установлен is_required флаг либо True , либо False в зависимости от того, содержит строка указанный текст или нет.

Комментарии:

1. это умно, понял. Спасибо за вашу помощь и время.