Функция os.walk в Python
Функция walk модуля os принимает один обязательный аргумент и несколько необязательных. В качестве обязательного аргумента должен быть передан адрес каталога.
Функция walk() возвращает объект-генератор, из которого получают кортежи. Каждый кортеж "описывает" очередной каталог из переданного в функцию дерева каталогов.
Каждый кортеж состоит из трех элементов:
- Адрес очередного каталога в виде строки.
- Список имен подкаталогов первого уровня вложенности в данный каталог. Если вложенных каталогов нет, список будет пустым.
- Список имен файлов первого уровня вложенности в данный каталог. Если вложенных файлов нет, список будет пустым.
Допустим, есть такое дерево каталогов:

Передадим каталог test функции os.walk():
import os tree = os.walk('test') print(tree) for i in tree: print(i)
<generator object walk at 0x7fa36d013740> ('test', ['cgi-bin'], ['index.html', 'dgs.png']) ('test/cgi-bin', ['another', 'backup'], ['hello.py']) ('test/cgi-bin/another', [], ['data.txt']) ('test/cgi-bin/backup', [], [])
Если передать абсолютный адрес, адреса каталогов также будут абсолютными:
import os for i in os.walk('/home/pl/test'): print(i)
('/home/pl/test', ['cgi-bin'], ['index.html', 'dgs.png']) ('/home/pl/test/cgi-bin', ['another', 'backup'], ['hello.py']) ('/home/pl/test/cgi-bin/another', [], ['data.txt']) ('/home/pl/test/cgi-bin/backup', [], [])
Поскольку walk() возвращает генератор, повторно извлечь из него данные нельзя. Поэтому, если возникает необходимость сохранить кортежи, генератор можно "превратить" в список кортежей:
import os tree = list(os.walk('test')) for i in tree: print(i)
('test', ['cgi-bin'], ['index.html', 'dgs.png']) ('test/cgi-bin', ['another', 'backup'], ['hello.py']) ('test/cgi-bin/another', [], ['data.txt']) ('test/cgi-bin/backup', [], [])
Чтобы получить полный адрес файла (абсолютный или относительный), следует воспользоваться функцией os.path.join:
import os.path for address, dirs, files in os.walk('test'): for name in files: print(os.path.join(address, name))
test/index.html test/dgs.png test/cgi-bin/hello.py test/cgi-bin/another/data.txt
Переменная address на каждой итерации связывается с первым элементом очередного кортежа (строкой, содержащей адрес каталога), dirs – со вторым элементом (списком подкаталогов), а files — со списком файлов этого каталога. Во вложенном цикле извлекается имя каждого файла из списка файлов.
У функции walk есть аргумент topdown, который по умолчанию имеет значение True. Если ему присвоить False, то обход дерева каталогов будет происходить не "сверху вниз" (от корневого к вложенным), а наоборот — "снизу вверх" (первыми будут подкаталоги).
import os tree = os.walk('test', topdown=False) for i in tree: print(i)
('test/cgi-bin/another', [], ['data.txt']) ('test/cgi-bin/backup', [], []) ('test/cgi-bin', ['another', 'backup'], ['hello.py']) ('test', ['cgi-bin'], ['index.html', 'dgs.png'])