Сканирование текстового документа на наличие строки и сохранение списка индексов совпадений — странный шаблон

#python #list #indexing #text #iteration

#python #Список #индексирование #текст #итерация

Вопрос:

Python 3.8 — У меня есть PDF-документ, состоящий из нескольких 3-5-страничных документов, объединенных в один PDF. Я просто отлично конвертирую его в текстовый документ.

Мне нужно извлечь некоторую информацию из каждого документа, поэтому я разделил текстовый документ на строки и попытался просто отсканировать строки, и если в строке указано «Страница 1», затем сохраните этот индекс в списке. Тогда я буду знать, как искать информацию о моем первом документе между первыми двумя индексами, где была найдена страница 1.

Результат этого списка значений индекса меня сильно смущает. Пожалуйста, смотрите ниже.

 pdf_list = next(os.walk(pdf_directory))[2]

for each_pdf in pdf_list:
    extension = str(each_pdf[-4:])
    if extension == '.pdf':
        with open(each_pdf, "rb") as f:
            pdf = pdftotext.PDF(f)
        with open(str(each_pdf[:-4]   '.txt'), "w") as f:
            f.write("nn".join(pdf))
#All groovy so far.. turned it into a .txt file. Looks correct.

for each_txt in pdf_list:
    extension = str(each_txt[-4:])
    if extension == '.txt':
        with open(each_txt, "r") as f:
            text = f.read()
            lines = text.splitlines()
            page_1_indices = []

            for each in lines:
                if "Page 1" in each:
                    new_index = lines.index(each)
                    page_1_indices.append(new_index)
            print(page_1_indices)
  

Вот результат… Он возвращается к предыдущим местам так беспорядочно, что я не вижу шаблона. Я имею в виду … прямо из ворот он снова попадает в 221 по индексу 4 ?!

[0, 88, 221, 310, 221, 874, 986, 221, 1303, 0, 221, 986, 1915, 874, 2155, 986, 2512, 2155, 986, 3079, 310, 3336, 2155, 3674, 1915, 2155, 4181, 4434, 2155, 4743, 4743, 986, 5235, 2155, 2155, 1915, 2155, 0, 2155, 0, 2155, 221, 5235, 4743, 2155, 2155, 221, 986, 2155, 2155, 8259, 4743, 0, 0, 8728, 4181, 221, 8259, 2155, 221, 2155, 5235, 0, 986, 10691, 1915, 2155, 3674, 0, 8259, 986, 986, 221, 12362, 0, 986, 0, 5235, 5235, 13232, 5235, 0, 5235, 986, 2155, 1915, 1915, 1915, 2155, 14646, 221, 221, 221, 2155, 1915, 3079, 221, 0, 221, 2155, 2155, 5235, 0, 1915, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 874, 874, 2155, 2155, 2155, 20468, 20468, 20468, 20468, 20468, 20468, 20468, 20468, 20468, 20468, 20468, 22193, 20468, 20468, 20468, 22193, 20468, 20468, 22193, 20468, 20468, 20468, 22193]

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

1. Не могли бы вы поделиться какой-то частью входных данных?

2. К сожалению, я не могу из-за личной информации в документах. Я буду работать над созданием тестового примера и его проверкой.

Ответ №1:

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

 with open(txt_file, "r") as f:
    text = f.read()
    lines = text.splitlines()
    page_1_indices = []
    for (i, j) in enumerate(lines):
        if "Page 1" in j:
            page_1_indices.append(i)
    print(page_1_indices)
  

вывод:

[0, 88, 221, 310, 523, 874, 986, 1167, 1303, 1392, 1476, 1691, 1915, 2062, 2155, 2295, 2512, 2719, 2868, 3079, 3214, 3336, 3517, 3674, 3838, 3985, 4181, 4434, 4612, 4743, 4886, 5044, 5235, 5385, 5584, 5759, 5887, 6034, 6121, 6249, 6327, 6470, 6562, 6833, 7016, 7164, 7364, 7696, 7917, 8110, 8259, 8399, 8526, 8639, 8728, 8862, 9088, 9346, 9504, 9638, 9871, 10049, 10385, 10473, 10691, 10891, 11028, 11209, 11408, 11488, 11647, 11934, 12179, 12362, 12541, 12627, 12830, 12918, 13075, 13232, 13304, 13489, 13578, 13749, 13968, 14104, 14226, 14385, 14507, 14646, 14867, 15159, 15295, 15386, 15543, 15671, 15851, 16063, 16148, 16348, 16472, 16635, 16718, 16806, 16965, 17068, 17255, 17376, 17509, 17672, 17816, 18009, 18178, 18317, 18445, 18626, 18784, 18947, 19069, 19256, 19437, 19571, 19700, 19824, 19934, 20096, 20295, 20468, 20602, 20818, 21017, 21216, 21337, 21458, 21579, 21713, 21912, 22039, 22193, 22333, 22507, 22694, 22828, 22985, 23166, 23353, 23481, 23609, 23731, 23883]