Зарегистрируйтесь, чтобы продолжить обучение

Виртуальная файловая система Python: Деревья

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

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

Как работать с файловой системой

Обработка любых деревьев в сущности не отличается. Файловая система, каталоги товаров, адреса, родственные связи и многое другое — все эти данные можно представить в виде дерева. Подход в работе с каждым типом будет один и тот же. Научившись работать с одним деревом, вы сможете применять эти же знания в работе с другими деревьями.

Вот как выглядит создание дерева виртуальной файловой системы:

from hexlet import fs

# Вторым параметром mkdir принимает список потомков,
# которые могут быть либо созданными mkdir директориями, либо созданными mkfile файлами
tree = fs.mkdir(
    "etc",
    [
        fs.mkfile("bashrc"),
        fs.mkdir(
            "consul",
            [
                fs.mkfile("config.json"),
            ],
        ),
    ],
)

В результате получается такая структура:

etc
├── bashrc
└── consul
    └── config.json

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

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

{
    "name": "etc",
    "type": "directory",
    "meta": {},
    "children": [
        {
            "name": "bashrc",
            "type": "file",
            "meta": {},
        },
        {
            "name": "consul",
            "type": "directory",
            "meta": {},
            "children": [
                {
                    "name": "config.json",
                    "type": "file",
                    "meta": {},
                }
            ],
        },
    ],
}

Это внутренняя реализация файлового дерева. Она состоит из двух типов узлов: директорий и файлов.

Посмотрим на представление директории:

{
    "name": "dir_name",
    "type": "directory",
    "meta": {},  # Свойства директории
    "children": [],  # Здесь хранятся потомки
}

А теперь изучим представление файла:

{
    "name": "file_name",
    "type": "file",
    "meta": {},  # Свойства файла
}

У файлов и директорий есть имена — это общая часть. Свойство type определяет тип узла. С его помощью во время обработки этого дерева можно понять, что именно находится перед нами. Еще есть свойство meta — это словарь с произвольными данными, например, размером, или датой создания.

Свойства задаются во время создания узлов:

mkfile(".bashrc", {"size": 75})
mkdir("hexlet", [], {"owner": "nobody"})

Метаданные понадобятся функциям, которые анализируют дерево — например, считают занятое место.


Дополнительные материалы

  1. Библиотека python-immutable-fs-trees

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на Python, Разработка веб-приложений и сервисов используя Django, проектирование и реализация REST API
10 месяцев
с нуля
Старт 24 апреля
профессия
новый
Автоматизированное тестирование веб-приложений на Python
8 месяцев
с нуля
Старт 24 апреля

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»