Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 28, 2018 09:48:02

na9ort
Зарегистрирован: 2018-09-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Поведение os.walk()

Здравствуйте.

Имею следующую файловую структуру:

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?
Почему мой вариант не работает? Вроде бы всё логично. Сначала цикл по папкам и вложенный цикл по файлам. Но не работает.

Отредактировано na9ort (Сен. 28, 2018 09:48:43)

Офлайн

#2 Сен. 28, 2018 10:44:54

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Поведение os.walk()

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 тоже не отрабатывает.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Сен. 28, 2018 10:54:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Поведение os.walk()

na9ort
Почему мой вариант не работает? Вроде бы всё логично.
Ты бы вывел на экран path, dirs, files , чтобы просто понять, как работает os.walk().



Офлайн

#4 Сен. 28, 2018 14:27:49

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Поведение os.walk()

os.walk выводит то же самое, что и панель тотал командера (анреал командера, far-а и т.д.), проводник венды или файл-менеджер линукса. Вы же в них не видите что находится во вложенных папках. Видны только имена вложенных папок и файлы, находящиеся в текущей папке.
Для получения содержимого вложенных папок заверни это дело в функцию и используй рекурсивный вызов с полным именем вложенной папки.

Отредактировано Rafik (Сен. 28, 2018 14:30:23)

Офлайн

#5 Сен. 28, 2018 14:55:12

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Поведение os.walk()

Rafik
Для получения содержимого вложенных папок заверни это дело в функцию и используй рекурсивный вызов с полным именем вложенной папки.
na9ort не слушайте его, os.walk проходит по всему дереву папок-подпапок.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version