Python Программа для извлечения разделов txt файла из списка слов - PullRequest
0 голосов
/ 09 мая 2020

Мне нужна программа python, которая должна печатать каждый раздел текстового файла. Раздел определяется ключевым словом, найденным из списка слов, и начинается со строки, в которой присутствует ключевое слово, и заканчивается на той строке, в которой начинается следующий раздел. Например, рассмотрим следующий текстовый файл

word1
abcdef
ghis jsd sjdhd jshj
word2
dgjgj dhkjhf
khkhkjd
word23
dfjkg fjidkfh
word5
diow299 udhgbhdi
jkdkjd
word89
eyuiywiou299092    
word3
...
...
...

Требуемый вывод программой:

Sections Found: [word1, word2, word3, word5, word89]

**********word1--SECTION**********
line 1: word1
line 2: abcdef
line 3: ghis jsd sjdhd jshj

**********word2--SECTION**********
line 4: word2
line 5: dgjgj dhkjhf
line 6: khkhkjd

**********word3--SECTION**********
line 14: word 3
line 15: ....

''' Suppose word4 is not found in the txt file then it should continue and move to next word found''' 
**********word5--SECTION**********
line 9: word5
line 10: diow299 udhgbhdi
line 11: jkdkjd

...
...
...
...

'''Continue till the end of list of words '''

Подход:

list_of_words = [' word1 ',' word2 ',' word3 ',' word4 ',' word5 ',' word6 ', ....]

найти start_line для каждого слова в list_of_word и сохранить их в списке

затем найдите end_line для каждого слова, отсортировав список так, чтобы было легко найти самую большую ближнюю конечную строку для слова

, затем распечатайте найденный раздел с их номером строки: line_in_text_file

Код, используемый для получения номера строки: (Как создать переменную для каждого n в list_of_words)

for n in list_of_words:
    with open(file_txt, 'r', encoding="utf8") as f:
        data_file = f.readlines()
    for num, lines in enumerate(data_file, 1):
        if n in lines:
            start_line = num
        else:
            continue

Код, используемый для поиска ближайшего числа больше n_start_line (val) start_line_list:

def closest(array_list, val):
    array_list1 = [j for j in array_list if j > val]
    array_list1.sort()
    return array_list1[0]

1 Ответ

0 голосов
/ 09 мая 2020

pyparsing имеет функцию генератора scanString, которая будет выдавать совпадающие токены и начальные и конечные местоположения совпадения. Используя начальное местоположение, вызовите метод pyparsing lineno, чтобы получить совпавший номер строки.

import pyparsing as pp

marker = pp.oneOf("word1 word2 word3 word4 word5 word23")

txt = """\
word1
abcdef
ghis jsd sjdhd jshj
word2
dgjgj dhkjhf
khkhkjd
word23
dfjkg fjidkfh
word5
diow299 udhgbhdi word2
jkdkjd
word89
eyuiywiou299092    
word3
"""

previous = None
for t, s, e in (pp.LineStart() + marker | pp.StringEnd()).scanString(txt):
    current_line_number = pp.lineno(s, txt)
    if t:
        current = t[0]
        if previous is not None:
            print(previous, "ended on line", current_line_number - 1)
        print("found", current, "on line", current_line_number)
        previous = current
    else:
        if previous is not None:
            print(previous, "ended on line", current_line_number)

Выводит:

found word1 on line 1
word1 ended on line 3
found word2 on line 4
word2 ended on line 6
found word23 on line 7
word23 ended on line 8
found word5 on line 9
word5 ended on line 13
found word3 on line 14
word3 ended on line 15

Вы сможете взять его отсюда.

...