Как легко получить список файлов в директории с помощью Python?
Как получить список всех файлов в директории с помощью Python
Если вам нужно получить список всех файлов и папок в директории с использованием Python, вам потребуется использовать модуль pathlib
. В данном руководстве вы познакомитесь с наиболее универсальными методами этого модуля для списка элементов в директории и узнаете немного об альтернативных инструментах.
Прежде чем был выпущен модуль pathlib
в Python 3.4, для работы с путями к файлам использовался модуль os
. Несмотря на его высокую производительность, все пути приходилось обрабатывать как строки.
Работа с путями в виде строк может показаться приемлемой изначально, но когда в дело вступают различные операционные системы, задача усложняется. Кроме того, вам приходится писать множество кода для работы со строками, что может отвлечь от сути работы с путями файлов. Все это может стать сложным и запутанным.
Примечание: Вы можете скачать файлы из материалов данного руководства, чтобы запустить несколько тестов. Эти тесты сравнят время, которое требуется для получения списка всех элементов в директории с использованием методов модуля pathlib
, модуля os
и даже будущей версии Python 3.12 модуля pathlib
. В новой версии доступна известная функция walk()
, которую мы не будем рассматривать в данном руководстве.
Это не означает, что работа с путями в виде строк невозможна - ведь разработчики много лет успешно справлялись без модуля pathlib
! Модуль pathlib
просто упрощает множество задач и позволяет сосредоточиться на основной логике вашего кода.
Все начинается с создания объекта Path
, который будет разным в зависимости от операционной системы. В Windows вы получите объект WindowsPath
, а в Linux и macOS - PosixPath
:
С помощью этих объектов, совместимых с различными операционными системами, вы можете использовать множество методов и свойств, которые предоставляет модуль pathlib
. Вот некоторые из них:
Получение списка всех файлов и папок в директории
Следующий код демонстрирует, как получить список всех файлов и папок в заданной директории:
В этом коде используется метод iterdir()
, который возвращает итератор со всеми элементами в заданной директории. Затем мы проходим по каждому элементу и проверяем, является ли он файлом или папкой с помощью методов is_file()
и is_dir()
.
Рекурсивное получение списка файлов и папок с помощью .rglob()
Если вам нужно получить список всех файлов и папок в директории и ее поддиректориях рекурсивно, вы можете использовать метод .rglob()
:
В этом коде используется метод .rglob("*")
, который рекурсивно получает все элементы (включая поддиректории) в заданной директории. Затем мы проходим по каждому элементу и проверяем, является ли он файлом или папкой.
Использование шаблонов Python glob для условного списка
Модуль pathlib
также поддерживает использование шаблонов Python glob для условного списка элементов в директории.
Условный список с использованием .glob()
Метод .glob()
позволяет фильтровать элементы в директории с использованием шаблонов Python glob. Например, вы можете только получить список файлов с расширением .txt
:
В этом коде мы используем шаблон *.txt
в методе .glob()
для фильтрации только файлов с расширением .txt
.
Условный список с использованием .rglob()
Метод .rglob()
также поддерживает условный список с использованием шаблонов Python glob. Например, вы можете получить список файлов с расширением .txt
в директории и ее поддиректориях:
В этом коде используется метод .rglob("*.txt")
, чтобы рекурсивно получить все файлы с расширением .txt
в заданной директории и ее поддиректориях.
Отфильтровывание “мусорных” директорий
Часто вам может понадобиться получить список файлов и папок в директории, но исключить некоторые “мусорные” директории. Например, вы можете хотеть исключить скрытые директории или директории с определенным именем.
Использование .rglob() для фильтрации целых директорий
Метод .rglob()
также позволяет фильтровать целые директории с использованием шаблонов Python glob. Например, вы можете исключить скрытые директории, начинающиеся с символа .
:
В этом коде мы используем шаблон [!.]*
в методе .rglob()
для фильтрации всех элементов, название которых не начинается с символа .
.
Создание рекурсивной функции .iterdir()
Если вам требуется более гибкий подход для фильтрации элементов в директории, вы можете создать свою собственную рекурсивную функцию, используя метод .iterdir()
объекта Path
. Например, вы можете создать функцию, которая исключит скрытые директории:
В этом коде мы определяем рекурсивную функцию recursive_iterdir()
, которая итерируется по элементам в директории и возвращает только те элементы, чье название не начинается с символа .
. Если элемент является директорией, функция вызывает сама себя для обработки поддиректории.
Заключение
В этом руководстве вы узнали, как получить список всех файлов и папок в директории с помощью Python. Модуль pathlib
предоставляет удобные методы для работы с путями к файлам и директориям. Вы также узнали о возможности рекурсивного получения списка элементов с помощью метода .rglob()
и условного списка с использованием шаблонов Python glob.
Каждый из этих методов имеет свои преимущества и ограничения, и выбор зависит от конкретных требований вашего проекта. Надеемся, что данное руководство поможет вам работать с файлами и директориями в Python более эффективно и гибко.