Os.listdir: примеры (PYTHON)

Использование os.listdir для получения содержимого директорий в Python
Раздел: Файловая система, Список файлов
os.listdir(path: str): list

Базовая информация о функции os.listdir

Функция os.listdir() в Python входит в стандартный модуль os и предназначена для получения списка имен записей в указанном каталоге.

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

Синтаксис функции: os.listdir(path='.')

  • path (необязательный, строка или байтовый объект): Путь к целевому каталогу. По умолчанию используется текущая рабочая директория ('.'). Можно передавать как обычные строки, так и байтовые строки (bytes).

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

Простые примеры применения

Пример 1: Вывод содержимого текущей директории.

import os
items = os.listdir()
print(items)
['folder1', 'main.py', 'data.txt', 'config.json']

Пример 2: Получение списка в указанном каталоге с помощью строкового пути.

import os
path = "/home/user/documents"
try:
    items = os.listdir(path)
    print(items)
except FileNotFoundError:
    print(f"Директория {path} не найдена")
['report.pdf', 'notes', 'photo.jpg']

Пример 3: Использование байтового пути (актуально для файловых систем, где имена не в кодировке Unicode).

import os
byte_path = b"/home/user/documents"
items = os.listdir(byte_path)
print(items)
[b'report.pdf', b'notes', b'photo.jpg']

Похожие функции в Python

os.scandir(): Возвращает итератор объектов os.DirEntry. Эти объекты содержат не только имя, но и дополнительную информацию (тип файла, атрибуты) без дополнительных системных вызовов. Эффективнее для обхода больших директорий.

pathlib.Path.iterdir(): Часть модуля pathlib (доступен с Python 3.4). Возвращает итератор объектов Path, что удобно для современного объектно-ориентированного подхода к работе с путями.

glob.glob(): Позволяет получать список путей, соответствующих заданному шаблону (например, *.txt). Полезно для фильтрации файлов по расширению или имени.

Выбор функции зависит от задачи: os.listdir хорош для простого получения списка имен, os.scandir - для производительности и получения метаданных, pathlib - для современного кода, glob - для фильтрации по шаблону.

Аналоги в других языках программирования

PHP: scandir($directory). Возвращает массив имен файлов и директорий, включает '.' и '..'.

$items = scandir("/path/to/dir");
print_r($items);
Array
(
    [0] => .
    [1] => ..
    [2] => file.txt
    [3] => folder
)

JavaScript (Node.js): fs.readdirSync(path) (синхронная версия).

const fs = require('fs');
const items = fs.readdirSync("./");
console.log(items);
[ 'app.js', 'node_modules', 'package.json' ]

Java: File.list() или Files.list(Path dir) (NIO2 API).

File dir = new File("/path");
String[] items = dir.list();
System.out.println(Arrays.toString(items));

C#: Directory.GetFiles(path) (только файлы) или Directory.GetFileSystemEntries(path) (файлы и папки).

string[] items = Directory.GetFileSystemEntries(@"C:\MyDir");
Console.WriteLine(String.Join(", ", items));

Golang: ioutil.ReadDir(dirname) (устарело) или os.ReadDir(name) (с Go 1.16). Возвращает срезы os.DirEntry или fs.DirEntry.

items, err := os.ReadDir(".")
if err != nil { log.Fatal(err) }
for _, item := range items {
    fmt.Println(item.Name())
}

Основное отличие от Python - частое включение специальных записей . и .. и разные подходы к обработке ошибок и возвращаемым типам данных (итераторы, массивы, срезы).

Распространенные ошибки

1. FileNotFoundError: Возникает при указании несуществующего пути.

import os
try:
    os.listdir("/nonexistent/path")
except FileNotFoundError as e:
    print(f"Ошибка: {e}")
Ошибка: [Errno 2] No such file or directory: '/nonexistent/path'

2. NotADirectoryError: Если переданный путь ведет к файлу, а не к директории.

import os
open('dummy.txt', 'w').close()
try:
    os.listdir('dummy.txt')
except NotADirectoryError as e:
    print(f"Ошибка: {e}")
Ошибка: [Errno 20] Not a directory: 'dummy.txt'

3. PermissionError: Отсутствие прав на чтение указанной директории.

import os
try:
    os.listdir("/root")
except PermissionError as e:
    print(f"Ошибка доступа: {e}")
Ошибка доступа: [Errno 13] Permission denied: '/root'

4. Путаница между путем и результатом: Функция возвращает только имена, а не полные пути. Для работы с файлами часто нужен полный путь, который можно получить с помощью os.path.join().

import os
folder = "my_folder"
for name in os.listdir(folder):
    full_path = os.path.join(folder, name)
    print(full_path)
my_folder/file1.txt
my_folder/subdir

Изменения в последних версиях Python

В Python 3.2 функция os.listdir() получила поддержку специального аргумента dir_fd, позволяющего указывать дескриптор открытой директории (для операций относительно него). Однако для listdir этот параметр не был реализован.

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

Важным контекстным изменением стало появление в Python 3.5 более производительной альтернативы - os.scandir(), которая позже легла в основу высокоуровневого обхода директорий.

Также начиная с Python 3.4, рекомендуется использовать объектно-ориентированный API модуля pathlib для новых проектов, хотя os.listdir() сохраняет полную поддержку и обратную совместимость.

Расширенные примеры использования

Пример 1: Фильтрация только файлов (исключая подкаталоги).

Пример python
import os
path = "."
items = os.listdir(path)
files_only = [item for item in items if os.path.isfile(os.path.join(path, item))]
print(f"Файлы: {files_only}")
Файлы: ['main.py', 'data.txt', 'config.json']

Пример 2: Получение списка с сортировкой по дате изменения.

Пример python
import os
path = "."
items = os.listdir(path)
items_with_mtime = [(item, os.path.getmtime(os.path.join(path, item))) for item in items]
sorted_items = sorted(items_with_mtime, key=lambda x: x[1], reverse=True)
print("Сортировка по дате изменения (сначала новые):")
for name, mtime in sorted_items:
    print(f"  {name} - {mtime}")
Сортировка по дате изменения (сначала новые):
  config.json - 1678886400.5
  main.py - 1678886300.2
  data.txt - 1678886200.8
  folder1 - 1678886100.1

Пример 3: Рекурсивный обход всех поддиректорий с помощью os.listdir.

Пример python
import os
def list_all(path):
    for entry in os.listdir(path):
        full_path = os.path.join(path, entry)
        print(full_path)
        if os.path.isdir(full_path):
            list_all(full_path)

list_all(".")
./main.py
./data.txt
./config.json
./folder1
./folder1/subfile.txt
./folder1/another.pdf

Пример 4: Использование с кодировками на Windows для работы с путями, содержащими не-ASCII символы.

Пример python
import os
import sys
# На Windows может потребоваться указать кодировку для файловой системы
if sys.platform == "win32":
    path = "тестовая_папка"
    # Создаем папку для примера
    if not os.path.exists(path):
        os.mkdir(path)
    items = os.listdir(path)
    print(f"Содержимое папки с русским названием: {items}")
Содержимое папки с русским названием: []

Пример 5: Сравнение производительности разных методов получения списка файлов.

Пример python
import os
import time
path = "/usr/bin"  # Большая директория для теста
start = time.time()
items_listdir = os.listdir(path)
time_listdir = time.time() - start
print(f"os.listdir: {len(items_listdir)} элементов, {time_listdir:.4f} сек.")
os.listdir: 2560 элементов, 0.0008 сек.

питон os.listdir function comments

En
Os.listdir List directory contents