Помогите пожалуйста сделать один список всех имён файлов из папки
Пытаюсь написать рекурсивную функцию которая будет заходить во вложенные папки в указанной папке и добавлять в список все файлы. Но моя функция создает для каждой папки новый список. Как мне добавлять это всё только в один список чтобы я мог его потом вернуть из функции? Код функции:
def parse_folder(path):
files = []
for file in os.listdir(path):
if isdir(path + '/' + file):
parse_folder(path + '/' + file)
files.append(file)
print(files)
Если у нас 2 вложенные папки в указанную папку будет 3 списка:
['profiles_settings.xml']
['.gitignore', 'inspectionProfiles', 'misc.xml', 'modules.xml', 'Project_1.iml', 'workspace.xml']
['.idea', 'Imp_helb.py']
А мне нужно чтобы был один список в котором все эти файлы. Я так понял что это происходит потому что я добавляю названия файлов, функция вызывается рекурсией и в начале функкции я обнуляю этот список, но я не знаю как это можно исправить.
Ответы (2 шт):
В функции делайте не печать списка файлов, а возвращайте этот список через return. При рекурсивном вызове добавляйте список файлов из рекурсивного вызова в общий список (метод списка .extend()).
import os
from os.path import isdir
def parse_folder(path):
files = []
for file in os.listdir(path):
if isdir(path + '/' + file):
files.extend(parse_folder(path + '/' + file))
else:
files.append(file)
return files
print(parse_folder("some_folder"))
А вообще, для рекурсивного обхода удобнее использовать метод rglob объекта Path из pathlib:
from pathlib import Path
def parse_folder(path):
path = Path(path)
files = []
for item in path.rglob("*"):
if item.is_file():
files.append(item.name)
return files
print(parse_folder("some_folder"))
Также для обхода дерева директорий можно использовать функцию os.walk, но она намного менее удобна в использовании чем метод Path.rglob.
Лучше использовать метод walk(). Он создает списки файлов и папок, входящих в папку по указанному пути. Причем списки files содержат отдельно файлы во вложенных папках. Поэтому проходимся по всем спискам files и добавляем в общий список
import os
path = "ссылка на папку" # используйте нужный метод задания ссылки на папку
list_of_file = []
for root, dirs, files in os.walk(path):
for file in files:
list_of_file.append(file)
print(list_of_file)