Поиск текста в нескольких файлах на Python

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

Для начала укажите текст, который вы хотите найти.

Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU
text = input("Please enter text: ")

Результат:

Поле для ввода текста и предложение его ввести

Напишите в поле ввода текст, который вы хотите найти, затем нажмите клавишу Enter. Например, введем слово “machine”.

print(f"You have entered \"{text}\" word to search.")

Результат:

You have entered “machine” word to search.

Получение текущего рабочего каталога

Модуль OS в Python предоставляет функции для взаимодействия с операционной системой. Это один из стандартных модулей Python. Он обеспечивает переносимый способ использования функциональности, зависящей от операционной системы.

Получение текущего рабочего каталога:

import os


current_path = os.getcwd()
current_path

Результат:

'E:\\jupyter-notebook-workspace'

Мой текущий рабочий каталог – E://jupyter-notebook-workspace. Но я хочу искать текст в другом каталоге.

Определяем путь, по которому хотим искать текст

Я хочу найти текст по пути “G:/data/input”. По этому пути у меня есть несколько файлов и папок.

Список файлов и папок в директории input
path = 'G:/data/input'
path

Результат:

'G:/data/input'

Вывод списка файлов в директории

Примечание редакции: на эту тему у нас есть отдельная статья с разбором нескольких подходов – “Как вывести список файлов в каталоге на Python”.

Давайте создадим функцию для смены директории на ту, где нужно искать текст, и вывода списка файлов в ней.

os.chdir(path) – смена текущего рабочего каталога на указанный путь.

os.listdir(path='.') возвращает список содержимого директории, заданной как path. Элементы списка будут идти в произвольном порядке и не будут включать специальные записи . и .., даже если они присутствуют в каталоге. Если во время вызова этой функции файл удаляется из каталога или добавляется в него, будет ли включено имя этого файла, не определено.

def searchText(path):    
    os.chdir(path)
    files = os.listdir()
    print(files)
    pass

searchText(path)

Результат:

['001–001-intent-recognition-with-bert.ipynb', '002–001-deploy-machine-learning-model-with-flask-on-heroku.ipynb', 'add-signup-form-in-react-native-mobile-app-part-7.ipynb', 'build-the-neural-network-with-pytorch.ipynb', 'call-graphql-api-in-react-native-mobile-app-part-5.ipynb', 'capture-date-phone-and-email-from-text-with-regular-expression-in-python.ipynb', 'classify-images-of-clothing-with-neural network.ipynb', 'color-and-shape.ipynb', 'samples']

Мы получили список файлов и папок в указанной директории.

Вывод всех файлов из каталога по одному

def searchText(path):    
    os.chdir(path)
    files = os.listdir()
    #print(files)
    for file_name in files:
        print(file_name)
    pass

searchText(path)

Вывод:

001–001-intent-recognition-with-bert.ipynb
002–001-deploy-machine-learning-model-with-flask-on-heroku.ipynb
add-signup-form-in-react-native-mobile-app-part-7.ipynb
build-the-neural-network-with-pytorch.ipynb
call-graphql-api-in-react-native-mobile-app-part-5.ipynb
capture-date-phone-and-email-from-text-with-regular-expression-in-python.ipynb
classify-images-of-clothing-with-neural network.ipynb
color-and-shape.ipynb
samples

Получаем абсолютный путь для каждого файла

def searchText(path):    
    os.chdir(path)
    files = os.listdir()
    #print(files)
    for file_name in files:
        #print(file_name)
        
        abs_path = os.path.abspath(file_name)
        print("Absolute path of the file:", abs_path)
    
    pass

searchText(path)

Вывод:

Absolute path of the file: G:\data\input\001–001-intent-recognition-with-bert.ipynb
Absolute path of the file: G:\data\input\002–001-deploy-machine-learning-model-with-flask-on-heroku.ipynb
Absolute path of the file: G:\data\input\add-signup-form-in-react-native-mobile-app-part-7.ipynb
Absolute path of the file: G:\data\input\build-the-neural-network-with-pytorch.ipynb
Absolute path of the file: G:\data\input\call-graphql-api-in-react-native-mobile-app-part-5.ipynb
Absolute path of the file: G:\data\input\capture-date-phone-and-email-from-text-with-regular-expression-in-python.ipynb
Absolute path of the file: G:\data\input\classify-images-of-clothing-with-neural network.ipynb
Absolute path of the file: G:\data\input\color-and-shape.ipynb
Absolute path of the file: G:\data\input\samples

Примечание редакции: вас также могут заинтересовать статьи “Как прописать на Python путь к файлу в Windows, Mac и Linux” и “Как в Python получить имя файла из пути к нему”.

Вы видите, что у нас есть папка samples. Файлы из этой папки тоже нужно добавить в общий список. Для этого нам нужно выполнить рекурсивный поиск.

Рекурсивный вывод содержимого директории

def searchText(path):    
    os.chdir(path)
    files = os.listdir()
    #print(files)
    for file_name in files:
        #print(file_name)
        abs_path = os.path.abspath(file_name)
        print("Absolute path of the file: ", abs_path)
        
        if os.path.isdir(abs_path):
            searchText(abs_path)
    pass

searchText(path)

Вывод:

Absolute path of the file: G:\data\input\001–001-intent-recognition-with-bert.ipynb
Absolute path of the file: G:\data\input\002–001-deploy-machine-learning-model-with-flask-on-heroku.ipynb
Absolute path of the file: G:\data\input\add-signup-form-in-react-native-mobile-app-part-7.ipynb
Absolute path of the file: G:\data\input\build-the-neural-network-with-pytorch.ipynb
Absolute path of the file: G:\data\input\call-graphql-api-in-react-native-mobile-app-part-5.ipynb
Absolute path of the file: G:\data\input\capture-date-phone-and-email-from-text-with-regular-expression-in-python.ipynb
Absolute path of the file: G:\data\input\classify-images-of-clothing-with-neural network.ipynb
Absolute path of the file: G:\data\input\color-and-shape.ipynb
Absolute path of the file: G:\data\input\samples
Absolute path of the file: G:\data\input\samples\alice-in-wonderland.txt
Absolute path of the file: G:\data\input\samples\ramayana.txt

Открытие каждого файла, чтение и поиск текста

def searchText(path):    
    os.chdir(path)
    files = os.listdir()
    #print(files)
    for file_name in files:
        #print(file_name)
        abs_path = os.path.abspath(file_name)
        
        if os.path.isdir(abs_path):
            searchText(abs_path)
            
        if os.path.isfile(abs_path):
             with open(file_name, 'r', encoding='utf-8') as f:
                if text in f.read():
                    final_path = os.path.abspath(file_name)
                    print(text + " word found in this path " + final_path)
                else:
                    print("No match found in " + abs_path)
    pass

searchText(path)

Вывод:

В выводе перед именами файлов, содержащих слово machine, идет строка "machine word found in". Эти строки вручную выделены желтым маркером

Текст найден в трех файлах.

Перевод статьи Nutan «Searching Text in Multiple Files in Python».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *