Comment compter le nombre de fichiers dans un répertoire en utilisant Python

J'ai besoin de compter le nombre de fichiers dans un répertoire en utilisant Python. Je suppose que le moyen le plus simple est len(glob.glob('*')), mais cela compte aussi le répertoire comme un fichier.

Existe-t-il un moyen de ne compter que les fichiers dans un répertoire?

124
demandé sur the Tin Man 2010-04-13 22:38:38

19 réponses

os.listdir() sera légèrement plus efficace que l'utilisation de glob.glob. Pour tester si un nom de fichier est un fichier ordinaire (et non un répertoire ou une autre entité), utilisez 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))])
171
répondu Daniel Stutzbach 2014-09-15 22:06:40
import os

path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
63
répondu Luke 2018-04-24 09:29:52

Pour tous les types de fichiers, les sous-répertoires inclus:

import os

list = os.listdir(dir) # dir is your directory path
number_files = len(list)
print number_files

Seuls les fichiers (en évitant les sous-répertoires):

import os

onlyfiles = next(os.walk(dir))[2] #dir is your directory path as string
print len(onlyfiles)
28
répondu Guillermo Pereira 2016-12-14 14:01:11

C'est là que fnmatch est très pratique:

import fnmatch

print len(fnmatch.filter(os.listdir(dirpath), '*.txt'))

Plus de détails: http://docs.python.org/2/library/fnmatch.html

24
répondu ngeek 2013-05-31 20:55:37
def directory(path,extension):
  list_dir = []
  list_dir = os.listdir(path)
  count = 0
  for file in list_dir:
    if file.endswith(extension): # eg: '.txt'
      count += 1
  return count
11
répondu ninjrok 2013-02-20 12:25:12
import os
print len(os.listdir(os.getcwd()))
9
répondu rash 2014-07-01 10:18:18

On utilise os.listdir et fonctionne pour n'importe quel répertoire:

import os
directory = 'mydirpath'

number_of_files = len([item for item in os.listdir(directory) if os.path.isfile(os.path.join(directory, item))])

Cela peut être simplifié avec un générateur et un peu plus rapide avec:

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)))
7
répondu joaquin 2012-06-07 19:14:29

Je suis surpris que personne n'a mentionné os.scandir:

def count_files(dir):
    return len([1 for x in list(os.scandir(dir)) if x.is_file()])
5
répondu qed 2017-05-18 09:24:04

Si vous voulez compter tous les fichiers dans le répertoire-y compris les fichiers dans les sous-répertoires, la manière la plus pythonique est:

import os

file_count = sum(len(files) for _, _, files in os.walk(r'C:\Dropbox'))
print(file_count)

Nous utilisons sum qui est plus rapide que d'ajouter explicitement le nombre de fichiers (timings en attente)

5
répondu Mr_and_Mrs_D 2017-12-22 13:51:12
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

Prise en charge à partir de ce post

4
répondu Kristian Damian 2010-04-13 18:48:44
import os

def count_files(in_directory):
    joiner= (in_directory + os.path.sep).__add__
    return sum(
        os.path.isfile(filename)
        for filename
        in map(joiner, os.listdir(in_directory))
    )

>>> count_files("/usr/lib")
1797
>>> len(os.listdir("/usr/lib"))
2049
4
répondu tzot 2010-04-13 22:31:34

Reformater le code de Luke.

import os

print len(os.walk('/usr/lib').next()[2])
3
répondu okobaka 2012-05-30 08:26:07

Voici une simple commande d'une ligne que j'ai trouvée utile:

print int(os.popen("ls | wc -l").read())
3
répondu Bojan Tunguz 2016-05-09 18:23:27
import os

total_con=os.listdir('<directory path>')

files=[]

for f_n in total_con:
   if os.path.isfile(f_n):
     files.append(f_n)


print len(files)
1
répondu Mohit Dabas 2014-09-29 06:30:32

Si vous utilisez le shell standard du système d'exploitation, vous pouvez obtenir le résultat beaucoup plus vite plutôt que d'utiliser pur pythonic façon.

Exemple Pour 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))
1
répondu styler 2015-04-08 13:38:55

J'ai trouvé une autre réponse qui peut être correcte comme réponse acceptée.

for root, dirs, files in os.walk(input_path):    
for name in files:
    if os.path.splitext(name)[1] == '.TXT' or os.path.splitext(name)[1] == '.txt':
        datafiles.append(os.path.join(root,name)) 


print len(files) 
1
répondu Ismail 2015-04-19 10:04:19

J'ai utilisé glob.iglob pour une structure de répertoire similaire à

data
└───train
│   └───subfolder1
│   |   │   file111.png
│   |   │   file112.png
│   |   │   ...
│   |
│   └───subfolder2
│       │   file121.png
│       │   file122.png
│       │   ...
└───test
    │   file221.png
    │   file222.png

Les Deux options suivantes retour 4 (comme prévu, c'est à dire ne compte pas les sous-dossiers eux-mêmes)

  • len(list(glob.iglob("data/train/*/*.png", recursive=True)))
  • sum(1 for i in glob.iglob("data/train/*/*.png"))
0
répondu user799188 2016-11-24 06:45:14

Je l'ai fait et cela a renvoyé le nombre de fichiers dans le dossier(Attack_Data)...cela fonctionne très bien.

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))
0
répondu Sam Ekoro 2017-01-11 16:03:16

C'est simple:

print(len([iq for iq in os.scandir('PATH')]))

Il compte simplement le nombre de fichiers dans le répertoire , j'ai utilisé la technique de compréhension de liste pour parcourir un répertoire spécifique en retournant tous les fichiers en retour . "len (liste retournée)" renvoie le nombre de fichiers.

-1
répondu Agha Saad 2018-07-31 15:06:00