Пропустить до содержимого

Как легко получить список файлов в директории с помощью Python?

[

Как получить список всех файлов в директории с помощью Python

Если вам нужно получить список всех файлов и папок в директории с использованием Python, вам потребуется использовать модуль pathlib. В данном руководстве вы познакомитесь с наиболее универсальными методами этого модуля для списка элементов в директории и узнаете немного об альтернативных инструментах.

Прежде чем был выпущен модуль pathlib в Python 3.4, для работы с путями к файлам использовался модуль os. Несмотря на его высокую производительность, все пути приходилось обрабатывать как строки.

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

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

Это не означает, что работа с путями в виде строк невозможна - ведь разработчики много лет успешно справлялись без модуля pathlib! Модуль pathlib просто упрощает множество задач и позволяет сосредоточиться на основной логике вашего кода.

Все начинается с создания объекта Path, который будет разным в зависимости от операционной системы. В Windows вы получите объект WindowsPath, а в Linux и macOS - PosixPath:

import pathlib
desktop = pathlib.Path("C:/Users/RealPython/Desktop") # для Windows
desktop = pathlib.Path("/home/RealPython/Desktop") # для Linux и macOS

С помощью этих объектов, совместимых с различными операционными системами, вы можете использовать множество методов и свойств, которые предоставляет модуль pathlib. Вот некоторые из них:

Получение списка всех файлов и папок в директории

Следующий код демонстрирует, как получить список всех файлов и папок в заданной директории:

import pathlib
directory = pathlib.Path("path/to/directory") # замените "path/to/directory" на путь к нужной директории
# Получение списка всех элементов в директории
items = directory.iterdir()
# Итерация по элементам и проверка, является ли каждый из них файлом или папкой
for item in items:
if item.is_file():
print(f"File: {item.name}")
elif item.is_dir():
print(f"Directory: {item.name}")

В этом коде используется метод iterdir(), который возвращает итератор со всеми элементами в заданной директории. Затем мы проходим по каждому элементу и проверяем, является ли он файлом или папкой с помощью методов is_file() и is_dir().

Рекурсивное получение списка файлов и папок с помощью .rglob()

Если вам нужно получить список всех файлов и папок в директории и ее поддиректориях рекурсивно, вы можете использовать метод .rglob():

import pathlib
directory = pathlib.Path("path/to/directory") # замените "path/to/directory" на путь к нужной директории
# Рекурсивное получение списка всех файлов и папок в директории
items = directory.rglob("*")
# Итерация по элементам и проверка, является ли каждый из них файлом или папкой
for item in items:
if item.is_file():
print(f"File: {item.name}")
elif item.is_dir():
print(f"Directory: {item.name}")

В этом коде используется метод .rglob("*"), который рекурсивно получает все элементы (включая поддиректории) в заданной директории. Затем мы проходим по каждому элементу и проверяем, является ли он файлом или папкой.

Использование шаблонов Python glob для условного списка

Модуль pathlib также поддерживает использование шаблонов Python glob для условного списка элементов в директории.

Условный список с использованием .glob()

Метод .glob() позволяет фильтровать элементы в директории с использованием шаблонов Python glob. Например, вы можете только получить список файлов с расширением .txt:

import pathlib
directory = pathlib.Path("path/to/directory") # замените "path/to/directory" на путь к нужной директории
# Условный список файлов с расширением .txt
txt_files = directory.glob("*.txt")
# Итерация по файлам и вывод их имен
for file in txt_files:
print(file.name)

В этом коде мы используем шаблон *.txt в методе .glob() для фильтрации только файлов с расширением .txt.

Условный список с использованием .rglob()

Метод .rglob() также поддерживает условный список с использованием шаблонов Python glob. Например, вы можете получить список файлов с расширением .txt в директории и ее поддиректориях:

import pathlib
directory = pathlib.Path("path/to/directory") # замените "path/to/directory" на путь к нужной директории
# Условный список файлов с расширением .txt в директории и ее поддиректориях
txt_files = directory.rglob("*.txt")
# Итерация по файлам и вывод их имен
for file in txt_files:
print(file.name)

В этом коде используется метод .rglob("*.txt"), чтобы рекурсивно получить все файлы с расширением .txt в заданной директории и ее поддиректориях.

Отфильтровывание “мусорных” директорий

Часто вам может понадобиться получить список файлов и папок в директории, но исключить некоторые “мусорные” директории. Например, вы можете хотеть исключить скрытые директории или директории с определенным именем.

Использование .rglob() для фильтрации целых директорий

Метод .rglob() также позволяет фильтровать целые директории с использованием шаблонов Python glob. Например, вы можете исключить скрытые директории, начинающиеся с символа .:

import pathlib
directory = pathlib.Path("path/to/directory") # замените "path/to/directory" на путь к нужной директории
# Исключение скрытых директорий
items = directory.rglob("[!.]*")
# Итерация по элементам и проверка, является ли каждый из них файлом или папкой
for item in items:
if item.is_file():
print(f"File: {item.name}")
elif item.is_dir():
print(f"Directory: {item.name}")

В этом коде мы используем шаблон [!.]* в методе .rglob() для фильтрации всех элементов, название которых не начинается с символа ..

Создание рекурсивной функции .iterdir()

Если вам требуется более гибкий подход для фильтрации элементов в директории, вы можете создать свою собственную рекурсивную функцию, используя метод .iterdir() объекта Path. Например, вы можете создать функцию, которая исключит скрытые директории:

import pathlib
def recursive_iterdir(directory):
for item in directory.iterdir():
if not item.name.startswith("."):
yield item
if item.is_dir():
yield from recursive_iterdir(item)
directory = pathlib.Path("path/to/directory") # замените "path/to/directory" на путь к нужной директории
# Получение списка всех элементов в директории с исключением скрытых директорий
items = recursive_iterdir(directory)
# Итерация по элементам и проверка, является ли каждый из них файлом или папкой
for item in items:
if item.is_file():
print(f"File: {item.name}")
elif item.is_dir():
print(f"Directory: {item.name}")

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

Заключение

В этом руководстве вы узнали, как получить список всех файлов и папок в директории с помощью Python. Модуль pathlib предоставляет удобные методы для работы с путями к файлам и директориям. Вы также узнали о возможности рекурсивного получения списка элементов с помощью метода .rglob() и условного списка с использованием шаблонов Python glob.

Каждый из этих методов имеет свои преимущества и ограничения, и выбор зависит от конкретных требований вашего проекта. Надеемся, что данное руководство поможет вам работать с файлами и директориями в Python более эффективно и гибко.