Нерекурсивный os.walk()
Я ищу способ сделать нерекурсивный os.walk()
ходить, как os.listdir()
работает. Но мне нужно вернуть таким же образом os.walk()
возвращается. Любая идея?
Заранее спасибо.
6 ответов
Добавить 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