#python #python-3.x
#python #python-3.x
Вопрос:
Я хотел бы:
- считывать строки из файла
- найти строку с указанным текстом (
## Required reading
) - выводить следующие строки после строки с определенным текстом, если они содержат звездочку (
*
) в начале строки - если в следующей строке больше нет строк со звездочкой (
*
) (или другой строки), она должна прекратиться
Итак, что я сделал до сих пор, это прочитал файл, получил строки и нашел конкретный текст, в данном случае это ## 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. это умно, понял. Спасибо за вашу помощь и время.