Помогите пожалуйста сделать один список всех имён файлов из папки

Рейтинг: 0Ответов: 2Опубликовано: 13.01.2023

Пытаюсь написать рекурсивную функцию которая будет заходить во вложенные папки в указанной папке и добавлять в список все файлы. Но моя функция создает для каждой папки новый список. Как мне добавлять это всё только в один список чтобы я мог его потом вернуть из функции? Код функции:

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.

▲ 1

Лучше использовать метод 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)