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

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

[

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

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

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

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

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

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

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

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

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

import pathlib
directory = pathlib.Path("/path/to/directory")
for item in directory.iterdir():
print(item)

Если вы хотите получить только файлы, вы можете добавить проверку с помощью метода is_file():

import pathlib
directory = pathlib.Path("/path/to/directory")
for item in directory.iterdir():
if item.is_file():
print(item)

Если вы хотите получить только папки, вы можете использовать метод is_dir():

import pathlib
directory = pathlib.Path("/path/to/directory")
for item in directory.iterdir():
if item.is_dir():
print(item)

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

import pathlib
directory = pathlib.Path("/path/to/directory")
for item in directory.glob("*.txt"):
print(item)

В этом случае будут выведены только файлы с расширением .txt.

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

import pathlib
directory = pathlib.Path("/path/to/directory")
for item in directory.rglob("*"):
print(item)

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

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

import pathlib
directory = pathlib.Path("/path/to/directory")
for item in directory.rglob("*.[!t]*"):
print(item)

В этом случае будут перечислены только файлы и папки, исключая те, которые начинаются с буквы “t”.

Кроме того, модуль pathlib предоставляет возможность определить свой собственный фильтри