Рекурсивно обходим дерево каталогов [ Python ]

Дата публикации:1 мая 2013 г. 21:47:56

Здравствуйте! Если вам необходимо рекурсивно обойти дерево каталогов, то этот пост возможно будет вам полезен. Итак, сразу к делу коду. Создадим файл py.py, добавим ему права на выполнение. В Ubuntu это так:

chmod +x py.py

Затем добавим внутрь это файла следующее:

#! /usr/bin/python
# -*- coding: utf-8 -*-

import os
import sys

#Функция ищет все файлы с именем filename во всех подкаталогах каталога catalog

def find_files(catalog, f):
    find_files = []
    for root, dirs, files in os.walk(catalog):
        find_files += [os.path.join(root, name) for name in files if name == f]
    return find_files

print find_files(sys.argv[1], sys.argv[2])

Спасибо стандартной библиотеке Python! Без нее срок кода было бы в разы больше, да и читабельность была бы хуже. Итак, что мы сделали? Модуль os.walk() создаем объект-генератор, который выполняет обход дерева каталогов. Что же касается find_files(), то я для сокращения строк кода написал все в однку строчку. Читабельность вроде не пострадала. Здесь мы проверяем равны ли текущее имя файла и аргумент, который мы передали в функцию при вызове.

sys.argv() как вам наверное известно позволяет принимать аргументы из коммандной строки. Вызвать функцию можно так (Ubuntu):

./py.py имя_каталога имя_файла

В ответ она вернет список, содержащий полные пути всех найденных файлов. Можно передавать как относительный путь (папка в том же каталоге, что и файл py.py), так и абсолютные. Решать вам.

Спасибо за внимание!

Метки:python, os.walk, обход дерева каталогов