Нерекурсивный os.walk()

Я ищу способ сделать нерекурсивный os.walk() ходить, как os.listdir() работает. Но мне нужно вернуть таким же образом os.walk() возвращается. Любая идея?

Заранее спасибо.

6 ответов

Решение
next(os.walk(...))

Добавить break после имен файлов для цикла:

for root, dirs, filenames in os.walk(workdir):
    for fileName in filenames:
        print (fileName)
    break   #prevent decending into subfolders

Это работает, потому что (по умолчанию) os.walk сначала перечисляет файлы в запрошенной папке, а затем переходит в подпапки.

Мое более параметризованное решение было бы следующим:

for root, dirs, files in os.walk(path):  
    if not recursive:  
        while len(dirs) > 0:  
            dirs.pop()  

    //some fency code here using generated list

Редактировать: исправляет, если / пока проблема. Спасибо, Dirk van Oosterbosch:}

Ну, то, что имел в виду Камиколо, больше соответствовало этому:

for str_dirname, lst_subdirs, lst_files in os.walk(str_path):
    if not bol_recursive:
          while len(lst_subdirs) > 0:
              lst_subdirs.pop()

Очистить список каталогов

      for r, dirs, f in os.walk('/tmp/d'):
    del dirs[:]
    print(f)

Гибкая функция подсчета файлов:

Вы можете установить рекурсивный поиск и какие типы вы хотите искать. Аргумент по умолчанию: file_types=("", )ищет любой файл. Аргумент file_types=(".csv",".txt")будет искать файлы csv и txt.

      from os import walk as os_walk

def count_files(path, recurse=True, file_types = ("",)):
    file_count = 0
    iterator = os_walk(path) if recurse else ((next(os_walk(path))), )
    for _, _, file_names in iterator:
        for file_name in file_names:
            file_count += 1 if file_name.endswith(file_types) else 0
    return file_count
Другие вопросы по тегам