Найти - Пользователи
Полная версия: Поведение os.walk()
Начало » Python для новичков » Поведение os.walk()
1
na9ort
Здравствуйте.

Имею следующую файловую структуру:
Catalog1/
Catalog1/Catalog2
Catalog1/file1.txt
Catalog1/Catalog2/file2.txt

Выполняю код:
 import os
 
for addresses, dirs, files in os.walk('Catalog1/'):
    for dir in dirs:
        for file in files:
            print(address + '/' + dir + '/' + file)
Получаю результат:
Catalog1/file.txt

Я ожидал получить:
Catalog1/file.txt
Catalog1/Catalog2/file2.txt

Если выполнить:
 import os
 
for addresses, dirs, files in os.walk('Catalog1/'):
        for file in files:
            print(address + '/' + file)
то я получаю то, что мне нужно.

Вопрос. Почему в моём случае (самый первый пример) цикл завершается раньше, чем итератор address перейдёт в значение Catalog1/Catalog2?
Почему мой вариант не работает? Вроде бы всё логично. Сначала цикл по папкам и вложенный цикл по файлам. Но не работает.
PEHDOM
na9ort
Я ожидал получить:
Видите ли, я вам открою один страшный секрет, его знают только избранные программисты и держат в строжайшей тайне. За то что я вам его открою меня могут даже забанить. Так вот программы работают вовсе не так как вы ожидаете, а так как запрограмировал програмист. Только тссс!!!
na9ort
Вроде бы всё логично. Сначала цикл по папкам и вложенный цикл по файлам. Но не работает.
Естественно. Почему? читаем выше, программа работает так как запрограмировал програмист, а не так как вы этого хотите. А чтобы понять как запрограмировал програмист нужно читать мануалы. https://docs.python.org/3/library/os.html#os.walk
Функция walk() возвращает объект-генератор, из которого получают кортежи для каждого каталога переданной файловой иерархии. Каждый кортеж состоит из трех элементов:

Адрес очередного каталога (тип данных - строка).
Имена подкаталогов первого уровня для данного каталога (тип данных - список).
Имена файлов данного каталога (список).
соотвевенно чтобы получить то что вы хотите нужно писать ваш второй вариант.
na9ort
Вопрос. Почему в моём случае (самый первый пример) цикл завершается раньше, чем итератор address перейдёт в значение Catalog1/Catalog2?
а он и не завершаеться, он в него переходит, но поскольку после перехода в Catalog1/Catalog2 кортеж dirs пустой, то for dir in dirs: сразу завершается, и не переходит к for file in files: и соотвевенно print тоже не отрабатывает.

py.user.next
na9ort
Почему мой вариант не работает? Вроде бы всё логично.
Ты бы вывел на экран path, dirs, files , чтобы просто понять, как работает os.walk().
Rafik
os.walk выводит то же самое, что и панель тотал командера (анреал командера, far-а и т.д.), проводник венды или файл-менеджер линукса. Вы же в них не видите что находится во вложенных папках. Видны только имена вложенных папок и файлы, находящиеся в текущей папке.
Для получения содержимого вложенных папок заверни это дело в функцию и используй рекурсивный вызов с полным именем вложенной папки.
PEHDOM
Rafik
Для получения содержимого вложенных папок заверни это дело в функцию и используй рекурсивный вызов с полным именем вложенной папки.
na9ort не слушайте его, os.walk проходит по всему дереву папок-подпапок.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB