os.walk() не печатает/не обращается к файлам

Я пытаюсь использовать os.walk для доступа ко всем файлам и всем вложенным папкам в данной папке. Сначала мой код выглядит так:

for root, dirs, files in os.walk("/home/DataScience"):   
    for dirName in dirs:
          print dirName

Однако вывод вышеприведенного кода помещает переменную files в список — вместо этого мне нужно, чтобы он выполнял итерацию по каждому объекту в списке.

Поэтому я добавляю дополнительный цикл for как таковой:

for root, dirs, files in os.walk("/home/DataScience"):   
    for dirName in dirs:
        for fileName in files:
            print dirName

Однако сейчас выхода нет. По какой-то причине кажется, что добавление дополнительного цикла приводит к тому, что оператор print в 4-й строке не выводится должным образом.

Тогда мой вопрос таков: почему этот дополнительный цикл for устраняет мой вывод?


person Z R    schedule 03.11.2015    source источник


Ответы (2)


Вам нужны два отдельных цикла для каталогов и файлов:

for parent, dirs, files in os.walk("/home/DataScience"):   
    for dirname in dirs:
        print dirname
    for filename in files:
        print filename
person falsetru    schedule 03.11.2015
comment
Интересно - есть причины почему? - person Z R; 03.11.2015
comment
@ZR, поскольку dirs — это список каталогов, files — это список файлов. - person falsetru; 03.11.2015
comment
Способ, которым я структурирую остальную часть скрипта, кажется, требует от меня перебора файлов после перебора одной части каталогов, поэтому я так стремился встроить один в другой. - person Z R; 03.11.2015
comment
@ZR: если dirs пусто, внутри него нет элементов, и нет причин для выполнения каких-либо внутренних циклов. - person inspectorG4dget; 03.11.2015
comment
Но кажется, что это никогда не так. Я не думаю, что есть ситуации, когда каталоги пусты. - person Z R; 03.11.2015
comment
@ZR, os.walk рекурсирует для тебя. и для каждой итерации он дает подкаталоги и файлы в каталоге. - person falsetru; 03.11.2015

Если вам нужны только файлы, а не папки в каталоге, и вы хотите работать с ними (скажем, открывать их), вам нужно сделать следующее:

import os
for root, subdirs, files in os.walk(directory):
    for file in files:
        print(root + os.sep + file)
        # or whatever file operation you're interested in

subdirs, или то, что вы называете dirs, это просто список папок в root. На каждом шаге os.walk() переходит в следующий подкаталог внутри root, делая ЭТО root. Таким образом, вам не нужно просматривать папки самостоятельно.

person BlivetWidget    schedule 03.11.2015
comment
Вы можете использовать os.path.join(root, file). - person falsetru; 03.11.2015
comment
@falsetru Это работает так же хорошо. Знаете ли вы, есть ли у любого варианта какое-либо неотъемлемое преимущество? Они оба читаемы и имеют одинаковые зависимости. - person BlivetWidget; 03.11.2015
comment
Согласно документации: ... Обратите внимание, что зная это недостаточно, чтобы иметь возможность анализировать или объединять пути — используйте os.path.split() и os.path.join()... - person falsetru; 03.11.2015
comment
@falsetru интересно, интересно почему, раз они не объясняют причину. os.sep никогда не доставлял мне проблем, хотя, надо признать, я не работаю над кросс-платформенными приложениями. - person BlivetWidget; 03.11.2015