Доброго денечка или вечерочка всем, кто забрел на эту страничку. Знаете, я недавно исполнил свою давнюю мечту. Дело в том, что с тех пор, как количество папок в моей электронной библиотеке перевалило за десяточку, я начал задумываться о структурированном каталоге, в котором будут красиво перечислены все собранные мной сочинения. Чтобы можно было одним легким взглядом окинуть простор прочитанных или заброшенных книг.
Впервые я задумался об этом в десятом классе. Уже тогда я точно знал, что буду поступать на 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. Как жаль, что опись домашней библиотеки придется делать в ручную