Рекурсивная функция. Поиск путей файлов во множесте папок
Хочу просканировать директорию с неопределённым количеством поддиректорий, и вывести список путей ко всем файлам.
import os
def path_cheker(dir):
file_list=[]
for item in os.listdir(dir):
full_path=os.path.join(dir,item)
if os.path.isdir(full_path): #Если item это папка, захит и сканирует её
path_cheker(full_path)
elif os.path.isfile(full_path):
file_list.append(full_path)
return file_list
task_dir="movie_analis\\task"
print(path_cheker(task_dir))
Выводит пустой список...:
[]
Подскажите пожалуйста, в чём ошибка с добавлением в список, голову сломал.
Из ответов: все рабочие,но моей логике больше всего подошло решение crazyelf
Конечный код, такого вида:
import os
def path_cheker(papka, result_list=None):
if result_list==None:
result_list=[]
for item in os.listdir(papka):
full_path=os.path.join(papka,item)
if os.path.isdir(full_path):
path_cheker(full_path)
elif os.path.isfile(full_path):
result_list.append(full_path)
return result_list
task_dir="movie_analis\\task"
path_cheker(task_dir)
Ответы (3 шт):
Самый простой способ -
[str(file) for file in pathlib.Path(dir).rglobe('\*.*')) if file.is_file()]
pathlib намного удобнее для операций с файлами, входит в стандартные библиотеки питона
У вас при каждом вызове функции список обнуляется file_list=[].
Вынесете создание списка из функции.
import os
file_list=[]
def path_cheker(dir):
Хоть ответ с выносом переменной из функции и работает, но так лучше не делать. По-нормальному все переменные должны передаваться в функции явным образом. В этой парадигме ваш код нужно было бы написать так:
def path_cheker(dir, file_list=None):
if file_list is None:
file_list=[]
for item in os.listdir(dir):
full_path=os.path.join(dir,item)
if os.path.isdir(full_path):
path_cheker(full_path, file_list)
elif os.path.isfile(full_path):
file_list.append(full_path)
return file_list
Обратите внимание, что нельзя использовать в питоне в качестве дефолтных параметров коллекции, например так file_list=[]. Почему - этот вопрос много раз тут обсуждался, я не буду повторяться. Ну то есть использовать конечно можно, но поведение функции будет не такое, как ожидается.
Кроме того, хорошо бы поменять название переменной dir на, скажем, path, потому что dir - это встроенная функция питона. Перекрывать встроенные функции нехорошо.