I need to count the number of files in a directory using Python.
I guess the easiest way is len(glob.glob('*')), but that also counts the directory itself as a file.
Is there any way to count only the files in a directory?
I need to count the number of files in a directory using Python.
I guess the easiest way is len(glob.glob('*')), but that also counts the directory itself as a file.
Is there any way to count only the files in a directory?
os.listdir() will be slightly more efficient than using glob.glob. To test if a filename is an ordinary file (and not a directory or other entity), use os.path.isfile():
import os, os.path
# simple version for working with CWD
print len([name for name in os.listdir('.') if os.path.isfile(name)])
# path joining version for other paths
DIR = '/tmp'
print len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))])
This is where fnmatch comes very handy:
import fnmatch
print len(fnmatch.filter(os.listdir(dirpath), '*.txt'))
More details: http://docs.python.org/2/library/fnmatch.html
This uses os.listdir and works for any directory:
import os
directory = 'mydirpath'
number_of_files = len([item for item in os.listdir(directory) if os.path.isfile(os.path.join(directory, item))])
this can be simplified with a generator and made a little bit faster with:
import os
isfile = os.path.isfile
join = os.path.join
directory = 'mydirpath'
number_of_files = sum(1 for item in os.listdir(directory) if isfile(join(directory, item)))
While I agree with the answer provided by @DanielStutzbach: os.listdir() will be slightly more efficient than using glob.glob.
However, an extra precision, if you do want to count the number of specific files in folder, you want to use len(glob.glob()). For instance if you were to count all the pdfs in a folder you want to use:
pdfCounter = len(glob.glob1(myPath,"*.pdf"))
def count_em(valid_path):
x = 0
for root, dirs, files in os.walk(valid_path):
for f in files:
x = x+1
print "There are", x, "files in this directory."
return x
Taked from this post
An answer with pathlib and without loading the whole list to memory:
from pathlib import Path
path = Path('.')
print(sum(1 for _ in path.glob('*'))) # Files and folders, not recursive
print(sum(1 for _ in path.glob('**/*'))) # Files and folders, recursive
print(sum(1 for x in path.glob('*') if x.is_file())) # Only files, not recursive
print(sum(1 for x in path.glob('**/*') if x.is_file())) # Only files, recursive
I used glob.iglob for a directory structure similar to
data
└───train
│ └───subfolder1
│ | │ file111.png
│ | │ file112.png
│ | │ ...
│ |
│ └───subfolder2
│ │ file121.png
│ │ file122.png
│ │ ...
└───test
│ file221.png
│ file222.png
Both of the following options return 4 (as expected, i.e. does not count the subfolders themselves)
len(list(glob.iglob("data/train/*/*.png", recursive=True)))sum(1 for i in glob.iglob("data/train/*/*.png"))If you'll be using the standard shell of the operating system, you can get the result much faster rather than using pure pythonic way.
Example for Windows:
import os
import subprocess
def get_num_files(path):
cmd = 'DIR \"%s\" /A-D /B /S | FIND /C /V ""' % path
return int(subprocess.check_output(cmd, shell=True))
This is an easy solution that counts the number of files in a directory containing sub-folders. It may come in handy;
import os
from pathlib import Path
def count_files(rootdir):
'''counts the number of files in each subfolder in a directory'''
for path in pathlib.Path(rootdir).iterdir():
if path.is_dir():
print("There are " + str(len([name for name in os.listdir(path) \
if os.path.isfile(os.path.join(path, name))])) + " files in " + \
str(path.name))
count_files(data_dir) # data_dir is the directory you want files counted.
You should get an output similar to this (with the placeholders changed, of course);
There are {number of files} files in {name of sub-folder1}
There are {number of files} files in {name of sub-folder2}
i did this and this returned the number of files in the folder(Attack_Data)...this works fine.
import os
def fcount(path):
#Counts the number of files in a directory
count = 0
for f in os.listdir(path):
if os.path.isfile(os.path.join(path, f)):
count += 1
return count
path = r"C:\Users\EE EKORO\Desktop\Attack_Data" #Read files in folder
print (fcount(path))
I solved this problem while calculating the number of files in a google drive directory through Google Colab by directing myself into the directory folder by
import os
%cd /content/drive/My Drive/
print(len([x for x in os.listdir('folder_name/']))
Normal user can try
import os
cd Desktop/Maheep/
print(len([x for x in os.listdir('folder_name/']))
A simple utility function I wrote that makes use of os.scandir() instead of os.listdir().
import os
def count_files_in_dir(path: str) -> int:
file_entries = [entry for entry in os.scandir(path) if entry.is_file()]
return len(file_entries)
The main benefit is that, the need for os.path.is_file() is eliminated and replaced with os.DirEntry instance's is_file() which also removes the need for os.path.join(DIR, file_name) as shown in other answers.