Python: list top-level directories with file count

Question:

I need to show the total file count for all top-level directories — including the ones that have a file count of zero. Each top-level directory can contain subdirectories – need the total count listed next to top-level directory only.

cnt = 0 

for dirpath, dirnames, files in os.walk(FILES):
    filecount = len(files)
    cnt += filecount
    print(dirnames,": ",filecount)

How can I get the above to print something like:

  • top-level-dir1: 234

  • top-level-dir2: 0

  • top-level-dir3: 5

  • ….etc.

So total files, including what’s in the nested subfolders, but print the total next to the top-level folders only.

UPDATE

    for directory in os.listdir(DOCUMENTS):
        if os.path.isdir(directory):
            filecount = 0
            for dirpath, dirnames, files in os.walk(directory):
                filecount += len(files)
        print(directory,": ",filecount)

I’m close — but this just shows file count as 1 for each.

Asked By: Kilgore Trout

||

Answers:

You are resetting the filecount variable for each directory. Instead, you want the count to persist over each directory in CONTRACTS.

Also, os.listdir(CONTRACTS) only shows the immediate directory names in CONTRACTS; for the script to work in directories other than the current directory, you need to use os.path.join() to specify the full path when you call os.walk().

Finally, as @TimRoberts says, you should use os.path.isdir() to check the output of os.listdir(), as it can also return files.

Something like this should do the trick:

import os

target = "target_directory"

for dir_name in os.listdir(target):
    dir_path = os.path.join(target, dir_name)
    if os.path.isdir(dir_path):
        file_count = 0
        for _, _, files in os.walk(dir_path):
            file_count += len(files)
        print(f"{dir_name}: {file_count}")
Answered By: Jack Taylor
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.