Как создать список Python с номером файла в каждом подкаталоге каталога

У меня есть основной каталог (корень), который содержит 6 подкаталогов. Я хотел бы подсчитать количество файлов, присутствующих в каждом подкаталоге, и добавить их в простой список Python.

Для этого результата: mylist = [497643, 5976, 3698, 12, 456, 745]

Я заблокирован по этому коду:

import os, sys
list = []
# Open a file
path = "c://root"
dirs = os.listdir( path )

# This would print all the files and directories
for file in dirs:
   print (file)

#fill a list with each sub directory number of elements
for sub_dir in dirs:
    list = dirs.append(len(sub_dir))

Моя попытка заполнить список не сработала, и я нахожусь в своих лучших проявлениях...

Поиск способа повторения подкаталога основного каталога и заполнения списка функцией, применяемой к каждому подкаталогу, ускорил бы скорость моего фактического проекта по науке о данных!

Спасибо за вашу помощь

Авель


person Abel    schedule 27.08.2020    source источник
comment
Отвечает ли это на ваш вопрос? Возвращает количество файлов в каталоге и подкаталоге   -  person sushanth    schedule 27.08.2020
comment
Использование os.walk() очень поможет. Он рекурсивно раскрывает подкаталоги.   -  person adamkgray    schedule 27.08.2020


Ответы (4)


Вы можете использовать os.path.isfile и os.path.isdir

res = [len(list(map(os.path.isfile, os.listdir(os.path.join(path, name))))) for name in os.listdir(path) if os.path.isdir(os.path.join(path, name))]
print(res)

Использование цикла for

res = []
for name in os.listdir(path):
    dir_path = os.path.join(path, name)
    if os.path.isdir(dir_path):
        res.append(len(list(map(os.path.isfile, os.listdir(dir_path)))))
person deadshot    schedule 27.08.2020
comment
С этими двумя решениями у меня есть это сообщение об ошибке: 7 list = [] ----> 8 res = [len (list (map (os.path.isfile, os.listdir (os.path.join (путь, имя) ))))) для имени в os.listdir(path) if os.path.isdir(os.path.join(path, name))] 9 print(res) TypeError: объект 'list' не вызывается - person Abel; 28.08.2020
comment
вы использовали list в качестве имени переменной где-то в своем коде, поэтому вы получаете ошибку. не используйте это list = [] измените имя на другое, оно будет работать - person deadshot; 28.08.2020

Вам нужно использовать os.listdir в каждом подкаталоге. Текущий код просто принимает длину пути к файлу.

import os, sys
list = []
# Open a file
path = "c://root"
dirs = os.listdir( path )

# This would print all the files and directories
for file in dirs:
   print (file)

#fill a list with each sub directory number of elements
for sub_dir in dirs:
    temp = os.listdir(sub_dir)
    list = dirs.append(len(temp))

Добавление этой строки в код выведет список подкаталогов

person davetherock    schedule 27.08.2020
comment
Если у вас есть подкаталоги в ваших подкаталогах, вам нужно будет использовать решение, связанное с @sushanth - person davetherock; 27.08.2020
comment
```FileNotFoundError Traceback (последний последний вызов) ‹ipython-input-1-9c2850a395c0› в ‹module› 11 #заполнить список числом элементов каждого подкаталога 12 для sub_dir в каталогах: ---› 13 temp = os .listdir(sub_dir) 14 list = dirs.append(len(temp)) FileNotFoundError: [WinError 3] Указанный путь доступа доступен: 'AMARYLLIDACEAE' - person Abel; 28.08.2020
comment
У меня есть эта ошибка с добавленной строкой кода. Учитывая, что «AMARYLLIDACEAE» является первым подкаталогом. Я работаю на ноутбуке Jupyter. - person Abel; 28.08.2020

Вы были почти там:

import os, sys

list = []

# Open a file
path = "c://root"
dirs = os.listdir(path)

# This would print all the files and directories
for file in dirs:
    print(file)

for sub_dir in dirs:
    if os.path.isdir(sub_dir):
        list.append(len(os.listdir(os.path.join(path, sub_dir))))

print(list)
person Gustave Coste    schedule 27.08.2020

В качестве альтернативы вы также можете использовать модуль glob для этой и других связанных задач. Я создал каталог test, содержащий 3 подкаталога l, m и k, каждый из которых содержит по 3 тестовых файла.

import os, glob
  
list = []
path = "test" # you can leave this "." if you want files in the current directory

for root, dirs, files in os.walk(path, topdown=True):
   for name in dirs:
     list.append(len(glob.glob(root + '/' +  name + '/*')))

print(list)

Выход :

[3, 3, 3]
person Grayrigel    schedule 27.08.2020
comment
Ваше решение близко к лучшему для моей проблемы :) Он создает два списка в списке: первый с полным путем + имя файлов, а второй с номером файла в каждом каталоге. Мне просто нужен второй список, и я знаю, как удалить первый список. Но как напрямую создать простой список только с номером файла в каждом подкаталоге? (без пути и каталога) - person Abel; 28.08.2020
comment
@Abel Я обновил код. Вам нужно path, потому что вам нужно с чего-то начинать. Вы можете оставить его равным "." для текущего каталога. Затем os.walk сделает всю работу за вас. - person Grayrigel; 28.08.2020