Как прочитать определенный абзац из нескольких папок и файлов

#python

#python

Вопрос:

У меня есть список, содержащий каталоги и имена файлов, которые я хочу открыть, прочитать абзац из и сохранить этот абзац в списке.

Проблема в том, что я не знаю, как «отфильтровать» абзац из файлов и вставить в мой список.

Пока мой код.

 rr = []
file_list = [f for f in iglob('**/README.md', recursive=True) if os.path.isfile(f)]
for f in file_list:
  with open(f,'rt') as fl:
    lines = fl.read()
    rr.append(lines)
  print(rr)
  

Формат файла, из которого я пытаюсь прочитать. Текст между началом абзаца и новым абзацем — это то, что я ищу

 There is text above this paragraph
## Required reading
    * line
    * line
    * line
     /n
### Supplementary reading
There is text bellow this paragraph
  

Когда я запускаю код, я получаю все строки из файлов, как и ожидалось.

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

1. Я рекомендую научиться работать с re модулем — docs.python.org/3/library/re.html . Это действительно очень мощный инструмент. Но что именно вы имеете в виду? Приведите примеры исходных и целевых данных, которые вы хотите извлечь.

2. Два вопроса (1) Какой абзац вы хотите? Всегда первый абзац? Всегда N-й абзац? Абзац, содержащий определенный текст? (2) Как файлы разделяют абзацы? Пустые строки между ними? Четыре или восемь пробелов в начале первой строки?

3. добавлен формат файла, из которого я читаю

Ответ №1:

Вам нужно узнать, как структурирован ваш импортированный текст. Как разделены абзацы? похоже ли это на ‘n n’, не могли бы вы разделить свой текстовый файл на ‘n n’ и вернуть индекс нужного вам абзаца?

 text = 'paragraph one textnnparagraph two textnnparagraph three text'.split('nn')[1]
print(text)
>>> 'paragraph two text'
  

Другой вариант, как упоминал кто-то еще, — это регулярное выражение, известное как RegEx, которое вы можете импортировать с помощью

 import re
  

Регулярное выражение используется для поиска шаблонов в тексте.

Перейдите к https://pythex.org / и возьмите образец одного из документов и поэкспериментируйте с поиском шаблона, который будет соответствовать абзацу, который вы хотите найти.

Узнайте больше о регулярном выражении здесь https://regexone.com/references/python

Ответ №2:

Решена моя проблема с разделением строк.

По сути, я просто просматриваю каждую строку на наличие начальной и конечной строк и создаю из них строки. Затем эти строки добавляются к списку и записываются в файл.

 for f in file_list:
        with open(f, 'rt') as fl:
            lines = fl.read()
            lines = lines[lines.find('## Required reading'):lines.find('## Supplementary reading')]
            lines = lines[lines.find('## Required reading'):lines.find('### Supplementary reading')]
            lines = lines[lines.find('## Required reading'):lines.find('## Required reading paragraph')]
            rr.append(lines)
  

Но у меня все еще есть «## Требуется чтение» в моем списке и в моем файле, поэтому я запускаю второй метод чтения / записи.

 def removeHashTag():
    global line
    f = open("required_reading.md", "r")
    lines = f.readlines()
    f.close()
    f = open("required_reading.md", "w")
    for line in lines:
        if line != "## Required reading"   "n":
            f.write(line)
    f.close()
removeHashTag()