Молодогвардейцев 454015 Россия, Челябинская область, город Челябинск 89085842764
MindHalls logo

Создание каталога электронной библиотеки с помощью Python

Доброго денечка или вечерочка всем, кто забрел на эту страничку. Знаете, я недавно исполнил свою давнюю мечту. Дело в том, что с тех пор, как количество папок в моей электронной библиотеке перевалило за десяточку, я начал задумываться о структурированном каталоге, в котором будут красиво перечислены все собранные мной сочинения. Чтобы можно было одним легким взглядом окинуть простор прочитанных или заброшенных книг.

Впервые я задумался об этом в десятом классе. Уже тогда я точно знал, что буду поступать на IT, поэтому логичная мысль пришла в голову: «давай, ты же программист!». На тот момент я умел писать Hello world в Си и решать некоторые задачки из ЕГЭ. Воодушевился и начал гуглить! Естественно, знаний совершенно недостаточно, ничего у меня не получилось, я бросил эту затею. В свое оправдание могу сказать, что работа с каталогами в Си совсем нетривиальна, особенно для десятиклассника, у которого в школе не было информатики.

И вот буквально пару дней назад я вновь заглянул в папочку «Library», дабы закачать что нибудь свеженькое на электронную книгу. И меня поразил гром среди ясного неба: «Я же умею питон! Наверняка в нем можно за пару строк описать любую директорию». Оказалось, что так и есть. Пять минут в поиске и я выбрал кандидата в мои помощники. Итак, встречайте!

Модуль os в Python

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

Функция walk из модуля os

Прототип:

os.walk(top, topdown=True)

Аргументы:

top — абсолютный адрес начальной директорий, из которой будет строится дерево;

topdown=True — флаг отвечает за направление построения дерева. По умолчанию True — строим вглубь, False — строим по направлению к корню файловой системы;

Возвращаемое значение:

Функция возвращает кортеж из трех элементов — абсолютный путь директории, вложенные директории и список файлов. И такой кортеж для каждой директории из списка вложенных. Невероятно удобный инструмент для обхода.

Понять, как это работает проще всего на примере.

Исходный код скрипта

import os

#Абсолютный путь корня библиотеки
libDir = '/home/kirill/Library'

#Файл для записи
file = open('Список книг электронной библиотеки', 'w')

#Берем по одному элементу из картежа
#Функция сначала вернет 3 кортежа для libDir, потом для первой сабдиректории, потом для второй и так далее
for d, subDirs, files in os.walk(libDir):
    #Убираем путь от корня, он нам не интересен
    currentDir = d.replace('/home/kirill/Library', '') + ": \n"
    #пропустить саму libDir
    if currentDir == ": \n": 
        continue
    
    file.write(currentDir)
    
    #Пробежать по файлам в текущей директории
    i = 0
    for f in files:
        currentFile = "\t" + str(i) + ') ' + f + "\n"
        file.write(currentFile)

        i += 1

file.close()

Заключение

Эта замечательная функция самое сложное сделала за нас, обошла в глубину все директории от корня и вернула список файлов. Благодаря этой затее с каталогом я познакомился с замечательным модулем os, с удовольствием продолжу над ним экспериментировать. На этом все, спасибо за внимание!

P.S. Как жаль, что опись домашней библиотеки придется делать в ручную