Язык программирования Python

Список каталогов и список файлов в каталоге на Python

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

Для примера возьмем каталог с содержимым, которое выглядит следующим образом:

+ Example |_ + dir_a |_ file2.txt |_ file3.txt |_ + dir_b |_ file4.txt |_ document.txt |_ file1.txt |_ image.jpg
Code language: JavaScript (javascript)

Список каталогов в Python с помощью функции listdir()

Чтобы просмотреть каталог в Python, просто используйте функцию listdir() модуля os.

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

import os content = os.listdir('/Users/Admin/Example') print(content)
Code language: JavaScript (javascript)

Результат:

['document.txt', 'image.jpg', 'dir_b', 'file.txt', 'dir_a']
Code language: JSON / JSON with Comments (json)

Проблема с использованием функции listdir() заключается в том, что она не позволяет отличить, являются ли перечисленные объекты файлами или каталогами.

Для этого нам необходимо использовать другие функции, такие как isfile() или isdir() из модуля os.path.

Например, чтобы отобразить файлы типа jpg, можно сделать следующее:

import os example_dir = '/Users/Admin/Example/' content = os.listdir(example_dir) images = [] for file in content: if os.path.isfile(os.path.join(example_dir, file)) and file.endswith('.jpg'): images.append(file) print(images)
Code language: JavaScript (javascript)

Результат выполнения приведенного выше кода над тестовым каталогом следующий:

['image.jpg']
Code language: JSON / JSON with Comments (json)

Обход каталога в Python с помощью функции scandir()

Если вам необходимо каким-то образом отфильтровать элементы, возвращаемые функцией listdir(), лучшим способом обхода каталога в Python является использование функции scandir(), также содержащейся в модуле os.

ПРИМЕЧАНИЕ: Эта функция была добавлена в Python версии 3.5. В настоящее время это рекомендуемый Python способ обхода каталога.

Эта функция на самом деле действует как итератор, а не возвращает список.

Более того, она не только извлекает имена файлов, но и возвращает объекты DirEntry, которые, помимо имени, содержат другие атрибуты, указывающие на то, является ли объект файлом, каталогом, его номер inode или полный путь.

Рассмотрим пример использования функции scandir() для перечисления файлов в каталоге в Python:

import os example_dir = '/Users/Admin/Example/' with os.scandir(example_dir) as files: for file in files: print(file.name)
Code language: JavaScript (javascript)

В результате мы получим следующее:

document.txt image.jpg dir_b file1.txt dir_a
Code language: CSS (css)

Как вы видите, scandir() используется в сочетании с оператором with, поскольку он поддерживает обработчики контекста.

Когда scandir() выполняется вместе с with, итератор закрывается, а все ресурсы, используемые итератором, освобождаются после его завершения.

Перечисление файлов в каталоге с помощью функции iterdir()

Еще одним модулем Python, предоставляющим функциональность для перебора каталогов и просмотра их содержимого, является модуль pathlib.

Этот модуль предлагает ряд объектов и свойств, которые позволяют выполнять наиболее распространенные операции над файлами и каталогами простым и эффективным способом.

Чтобы перечислить каталог с помощью pathlib, мы должны создать объект Path, который, в зависимости от используемой операционной системы, будет иметь тип PosixPath или WindowsPath.

Эти объекты Path имеют метод iterdir(), который создает итератор, проходящий через все файлы и папки в каталоге.

Кроме того, объекты класса Path содержат такие свойства, как name, с именем файла, и такие методы, как is_file() или is_dir(), которые позволяют проверить, является ли он файлом или каталогом.

Вот пример использования pathlib:

import pathlib example_dir = '/Users/Admin/Example/' dir = pathlib.Path(example_dir) for file in dir.iterdir(): print(file.name)
Code language: JavaScript (javascript)

В результате мы получим:

document.txt image.jpg dir_b file1.txt dir_a
Code language: CSS (css)

Рекомендуемые методы

Теперь, когда мы рассмотрели три различных способа обхода каталога в Python, отмечу, что рекомендуемые варианты – это использование функции scandir() или метода iterdir() в pathlib.

Примеры

Далее мы увидим, как применять фильтры для просмотра только файлов, только определенных файлов или только подкаталогов данного каталога.

Recorrer los ficheros de un directorio con scandir

import os example_dir = '/Users/Admin/Example/' with os.scandir(example_dir) as files: files = [file.name for files in files if file.is_file()] print(files)
Code language: JavaScript (javascript)

Результат:

['document.txt', 'image.jpg', 'file1.txt']
Code language: JSON / JSON with Comments (json)

Чтобы просмотреть только файлы jpg, можно добавить еще одно условие:

with os.scandir(example_dir) as files: files = [file.name for file in files if file.is_file() and file.name.endswith('.jpg')]
Code language: JavaScript (javascript)

Обход файлов в каталоге с помощью iterdir

import pathlib example_dir = '/Users/Admin/Example/' dir = pathlib.Path(example_dir) files = [file.name for file in dir.iterdir() if file.is_file()]
Code language: JavaScript (javascript)

Список подкаталогов каталога с помощью scandir

import os example_dir = '/Users/Admin/Example/' with os.scandir(example_dir) as files: subdir = [file.name for file in files if file.is_dir()] print(subdir)
Code language: JavaScript (javascript)

Результат:

['dir_b', 'dir_a']
Code language: JSON / JSON with Comments (json)

Список подкаталогов каталога с помощью iterdir

import pathlib example_dir = '/Users/Admin/Example/' dir = pathlib.Path(example_dir) files = [file.name for file in dir.iterdir() if file.is_dir()]
Code language: JavaScript (javascript)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *