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.