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

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

[

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

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

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

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

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

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

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

import pathlib
desktop = pathlib.Path("C:/Users/RealPython/Desktop")
print(desktop) # WindowsPath("C:/Users/RealPython/Desktop")
import pathlib
desktop = pathlib.Path("/home/RealPython/Desktop")
print(desktop) # PosixPath('/home/RealPython/Desktop')

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

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

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

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

Чтобы использовать .rglob(), вы должны создать объект Path и затем вызвать метод .rglob("pattern") на этом объекте, где pattern - это шаблон для фильтрации определенных файлов или папок. Если вы хотите перечислить все файлы и папки без фильтрации, вы можете просто использовать "**/*" в качестве шаблона.

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

import pathlib
path = pathlib.Path("path/to/directory")
files = list(path.rglob("**/*"))

Это вернет список всех файлов и папок в каталоге и его подкаталогах. Если вы хотите получить только файлы или только папки, вы можете добавить дополнительное условие фильтрации:

import pathlib
path = pathlib.Path("path/to/directory")
files = list(path.rglob("**/*"))
directories = [f for f in files if f.is_dir()]
files = [f for f in files if f.is_file()]

Использование шаблона Python Glob для условного перечисления

В Python Glob можно использовать шаблоны для фильтрации файлов и папок в каталоге. Шаблоны могут содержать специальные символы, которые представляют собой шаблоны сопоставления, например, *, который сопоставляет любую последовательность символов, и ?, который сопоставляет одиночный символ. Вы также можете использовать набор символов в квадратных скобках для указания диапазона символов.

Условное перечисление с использованием .glob()

Метод .glob() позволяет вам выполнять условное перечисление файлов и папок в каталоге. Вы создаете объект Path и вызываете метод .glob("pattern"), передавая ему шаблон, который должны соответствовать файлы или папки.

Вот пример использования .glob() для перечисления всех файлов в каталоге с расширением .txt:

import pathlib
path = pathlib.Path("path/to/directory")
files = list(path.glob("*.txt"))

Это вернет список всех файлов с расширением .txt в каталоге.

Условное перечисление с использованием .rglob()

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

import pathlib
path = pathlib.Path("path/to/directory")
files = list(path.rglob("*.py"))

Это вернет список всех файлов с расширением .py в каталоге и его подкаталогах.

Расширенное сопоставление с помощью методов Glob

Методы .glob() и .rglob() также позволяют более сложное сопоставление с использованием шаблонов Python Glob. Например, вы можете использовать набор символов в квадратных скобках для сопоставления определенного диапазона символов или использовать несколько шаблонов, разделенных запятыми, для сопоставления нескольких вариантов.

Вот несколько примеров:

import pathlib
path = pathlib.Path("path/to/directory")
# Сопоставление всех файлов, начинающихся с буквы A или B
files = list(path.glob("[AB]*"))
# Сопоставление всех файлов с расширениями .txt или .py
files = list(path.glob("*.txt, *.py"))

Отказ от перечисления “мусорных” каталогов

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

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

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

import pathlib
path = pathlib.Path("path/to/directory")
files = list(path.rglob("*"))
files = [f for f in files if not f.is_dir() or not f.name.startswith(".")]

Это удалит все каталоги, начинающиеся с символа ., из списка результатов.

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

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

import pathlib
def list_files(path):
files = []
for item in path.iterdir():
if item.is_file():
files.append(item)
elif item.is_dir():
files.extend(list_files(item))
return files
path = pathlib.Path("path/to/directory")
files = list_files(path)

Эта функция будет рекурсивно перечислять файлы и папки в каталоге и его подкаталогах.

Заключение

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

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

// Python-Sample-Code-Link