2015-11-26 5 views
1

Я хочу перебирать подкаталоги в каталоге и получать количество файлов в каждом из подкаталогов. Мой (грязный) решение выглядит следующим образом:Как перебирать подкаталоги в каталоге и подсчитывать файлы в подкаталогах в python

import os, sys 
import subprocess 

def Count_files_in_subd(): 

    for root, dirs, files in os.walk("/Path/to/directory", topdown=False): 
     for name in dirs: 
      print name 
      f = os.path.join(root, name) 
      os.chdir(f) 
      i=0 
      for filename in os.listdir(os.getcwd()): 
       i+=1 
      print i 


Count_files_in_subd() 

Сценарий первый смотрит на подкаталоги в каталоге один за другим, а не изменения в каталог он «смотрит на», сосчитать файлы внутри.

Это работает, но я знаю, что в python есть более хороший способ сделать это. Я просмотрел разные вопросы по SO, но когда я пробовал большинство решений, количество файлов для каждого подкаталога было всего одним, и я предполагаю, что каталог считается файлом. Любая помощь в том, как сделать это лучше, будет оценена по достоинству.

ответ

1

Вы можете просто перекодировать следующим образом, чтобы показать количество файлов в каждой папке:

import os 

def Count_files_in_subd(): 
    for root, dirs, files in os.walk("/Path/to/directory"): 
     print "{} in {}".format(len(files), root) 

Count_files_in_subd() 

root держит текущую папку наступания и files уже содержит все файлы в этой папке, так что все вы необходимо их подсчитать: len(files).

dirs содержит любые папки, найденные в текущей папке (к которой будет доступен следующий). Если вы не хотите посещать определенную папку, их можно удалить из этого списка.

Это даст вам следующий вид продукции:

5 in /Path/to/directory 
10 in /Path/to/directory/folder_1 
3 in /Path/to/directory/folder_1/deeper 
+0

Благодарим Вас за объяснений, у меня была ошибка в моем мышлении :-) –

+1

Да, что верно, лучше имена переменных будет 'dirpath',' 'dirnames' и filenames'. Вы передаете корень функции 'os.walk'. –

0

Вы можете сделать это в Баше, это не так чисто, но с рекурсивным списком вы можете быть уверены, чтобы пройти через каждый каталог.

ls -lR|while read i ; do J=$(echo $i|awk '{print $1}'|grep d|wc -l); echo  $J; if [ $J -gt 0 ]; then echo "GREATER"; fi done