В этой статье мы будем искать текст или строку в нескольких файлах. План действий следующий: определяем директорию, в которой нужно искать, получаем список всех файлов в этой директории (в том числе во вложенных папках), а затем открываем каждый файл и ищем в нем нужный текст.
Для начала укажите текст, который вы хотите найти.
Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: 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”. По этому пути у меня есть несколько файлов и папок.
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)
Вывод:
Текст найден в трех файлах.
Перевод статьи Nutan «Searching Text in Multiple Files in Python».