Поиск файлов с определенными расширениями — распространенная задача при работе с файлами в Python. В этой статье рассматриваются несколько эффективных и универсальных способов решения этой задачи, отвечающих различным потребностям и стилям кодирования. Мы рассмотрим различные модули и методы Python, позволяющие выбрать оптимальный подход для вашего конкретного случая использования.
Оглавление
- Использование модуля
glob
- Использование модуля
os
- Использование
pathlib
для поиска в одном каталоге - Рекурсивный поиск с помощью
os.walk
- Рекурсивный поиск с помощью
pathlib.rglob
1. Использование модуля glob
Модуль glob
предлагает краткий способ поиска файлов, соответствующих заданному шаблону, в одном каталоге. Его функция glob()
возвращает список путей, удовлетворяющих шаблону.
import glob
def find_files_with_extension_glob(directory, extension):
"""Находит файлы с заданным расширением используя glob.glob()."""
return glob.glob(f"{directory}/*{extension}")
# Пример:
files = find_files_with_extension_glob("./my_directory", ".txt")
print(files)
2. Использование модуля os
Модуль os
обеспечивает более тонкий контроль. os.listdir()
перечисляет все записи в каталоге, позволяя настраивать фильтрацию.
import os
def find_files_with_extension_os(directory, extension):
"""Находит файлы с заданным расширением используя os.listdir()."""
files = []
for filename in os.listdir(directory):
if filename.endswith(extension):
files.append(os.path.join(directory, filename))
return files
# Пример:
files = find_files_with_extension_os("./my_directory", ".txt")
print(files)
3. Использование pathlib
для поиска в одном каталоге
Модуль pathlib
обеспечивает объектно-ориентированный подход. Его метод glob()
предлагает более чистый синтаксис, чем glob.glob()
.
from pathlib import Path
def find_files_with_extension_pathlib(directory, extension):
"""Находит файлы с заданным расширением используя pathlib.glob()."""
return list(Path(directory).glob(f"*{extension}"))
# Пример:
files = find_files_with_extension_pathlib("./my_directory", ".txt")
print(files)
4. Рекурсивный поиск с помощью os.walk
Для поиска в подкаталогах os.walk()
обходит дерево каталогов, позволяя проверять каждый файл на наличие нужного расширения.
import os
def find_files_recursive_os(directory, extension):
"""Рекурсивно находит файлы с заданным расширением используя os.walk()."""
files = []
for root, _, filenames in os.walk(directory):
for filename in filenames:
if filename.endswith(extension):
files.append(os.path.join(root, filename))
return files
# Пример:
files = find_files_recursive_os("./my_directory", ".txt")
print(files)
5. Рекурсивный поиск с помощью pathlib.rglob
Метод rglob()
модуля pathlib
предлагает наиболее элегантное решение для рекурсивного поиска.
from pathlib import Path
def find_files_recursive_pathlib(directory, extension):
"""Рекурсивно находит файлы с заданным расширением используя pathlib.rglob()."""
return list(Path(directory).rglob(f"*{extension}"))
# Пример:
files = find_files_recursive_pathlib("./my_directory", ".txt")
print(files)
Не забудьте создать папку «my_directory» с некоторыми файлами .txt, чтобы примеры работали корректно. Выберите метод, который наилучшим образом соответствует вашему стилю кодирования и требованиям проекта. Для простого поиска в одном каталоге glob
или pathlib.glob()
являются отличным выбором. Для рекурсивного поиска pathlib.rglob()
обеспечивает наиболее краткое и читаемое решение.