Шаг 91.
Python: сборник рецептов.
Файлы и ввод-вывод. Получение содержимого каталога

    На этом шаге мы рассмотрим различные способы решения этой задачи.

Задача

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

Решение

    Используйте функцию os.listdir() для получения списка файлов в каталоге:

import os

names = os.listdir('somedir')

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

import os.path

# Получить все обычные файлы
names = [name for name in os.listdir('somedir')
if os.path.isfile(os.path.join('somedir', name))]

# Получить все каталоги
dirnames = [name for name in os.listdir('somedir')
            if os.path.isdir(os.path.join('somedir', name))]

    Строковые методы startswith() и endswith() также могут быть полезны для фильтрации содержимого каталога. Например:

pyfiles = [name for name in os.listdir('somedir') if name.endswith('.py')]

    Для поиска совпадений по имени файла вы можете использовать модули glob или fnmatch. Например:

import glob
pyfiles = glob.glob('somedir/*.py')

from fnmatch import fnmatch
pyfiles = [name for name in os.listdir('somedir') if fnmatch(name, '*.py')]


Обсуждение

    Получить содержимое каталога просто, но эта операция дает вам просто имена элементов в каталоге. Если вы хотите получить дополнительные метаданные, такие как размеры файлов, даты изменений и т. д., вам нужны либо дополнительные функции модуля os.path, либо функция os.stat(). Например:

# Пример получения содержимого каталога

import os
import os.path
import glob

pyfiles = glob.glob('*.py')

# Получение размеров файлов и дат модификации
name_sz_date = [(name, os.path.getsize(name), os.path.getmtime(name))
                for name in pyfiles]

for name, size, mtime in name_sz_date:
    print(name, size, mtime)

# Альтернатива: получение метаданных
file_metadata = [(name, os.stat(name)) for name in pyfiles]
for name, meta in file_metadata:
    print(name, meta.st_size, meta.st_mtime)

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

    На следующем шаге мы рассмотрим обход кодировки имен файлов.




Предыдущий шаг Содержание Следующий шаг