Как прочитать несколько текстовых файлов одновременно и найти определенный текст между двумя текстами?

#python #string #list #find

#python #строка #Список #Найти

Вопрос:

Этот код отлично работает, если я работаю с одним текстовым файлом за раз. Но если я раскомментирую последние три строки и прокомментирую инструкцию print для одновременной работы с этим кодом с несколькими файлами, тогда этот код не работает. Он не выдает никаких ошибок, но и не выдает никаких выходных данных!

 import pathlib

def extract_text(filename):
    start = "#patient_name').val('"
    end = "');$('#father_name"
    with open(filename, 'rt') as myfile:
        text = myfile.read()
        return text[text.find(start) len(start):text.rfind(end)]


print(extract_text('new.txt'))
    #patients = []
    #for filename in pathlib.Path('.').glob('*.txt'):
     #patients.append(extract_text(filename))
 

Это мои временные текстовые файлы со значениями, которые я хочу в нем:

введите описание изображения здесь

Это результат, если я использую код для одного файла за раз

Встроенное изображение

И это результат, когда я использую этот код для нескольких файлов:

Встроенное выходное изображение

Примечание: этот код написан не полностью мной. Кто-то помог мне ответить на мой последний вопрос о переполнении стека.

У меня есть еще один код, который я получил от geeksforgeeks, но он также не работает.

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

1. Вы пытались изменить отступы, чтобы они были правильными?

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

3. Почему строки тезисов имеют отступ, они должны быть в начале строки. patients = [] for filename in pathlib.Path('.').glob('*.txt'): patients.append(extract_text(filename))

4. Хорошо, братан, это сработало @Bashi, большое спасибо.. Иногда из-за таких мелочей у тебя возникают проблемы, еще раз спасибо, приятель!!

Ответ №1:

Используйте Glob вместо Pathlib.

 import glob

def extract_text(filename):
    start = "#patient_name').val('"
    end = "');$('#father_name"
    with open(filename, 'rt') as myfile:
        text = myfile.read()
    myfile.close()
    return text[text.find(start) len(start):text.rfind(end)]

#using glob for getting all text files instead of Path module
patients = []
for filename in glob.glob('./*.txt'):
    print(extract_text(filename))
 

Это сработает.

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

1. Пробовал… Не работает, брат! Я пробовал печатать пациентов, myfile, text, filename, но ничего не работает!!

2. Я обновил, можете ли вы попробовать это.

3. Да, ваш код работает, но результат выводится в формате списка, т.е. [name1, name2, name3, name4]. Но если мы печатаем (extract_text(filename)), то он печатает все имена в формате raw, а также одно имя в одной строке. кстати, большое спасибо за помощь, брат!

4. Да, круто, я отредактировал его и добавил комментарии на случай будущих ссылок.

5. Если это правильно, можете ли вы выбрать правильный ответ для дальнейшего использования. Спасибо.

Ответ №2:

Как сказал @Bashi в комментарии, это была ошибка отступа и окончательный рабочий код здесь

 import pathlib

def extract_text(filename):
    start = "#patient_name').val('"
    end = "');$('#father_name"
    with open(filename, 'rt') as myfile:
        text = myfile.read()
        return text[text.find(start) len(start):text.rfind(end)]

patients = []
for filename in pathlib.Path('.').glob('*.txt'):
    print(extract_text(filename))