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

224

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 également le répertoire lui-même comme un fichier.

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

prosseek
la source
Pour exclure les répertoires, vous pouvez faire '* .fileextension' pour l'extension de fichier que vous recherchez.

Réponses:

275

os.listdir()sera légèrement plus efficace que l'utilisation 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))])
Daniel Stutzbach
la source
14
N'oubliez pas d'ajouter l' folder_pathintérieur os.path.filename(name)si vous n'êtes pas sur le cwd. stackoverflow.com/questions/17893542/…
Rafael Oliveira
1
Cela ne compte pas le fichier dans les dossiers imbriqués.
codersofthedark
5
Pour compter de manière récursive les fichiers imbriqués dans des répertoires, vous pourriez être mieux avec la solution os.walk ().
Joel B
Quel est l'avantage d'utiliser os.path.join(DIR, name)Over DIR + '/' + name? Cette dernière est plus courte et, à mon avis, plus claire que la première. Existe-t-il peut-être des OS sur lesquels ces derniers échoueraient?
HelloGoodbye
@HelloGoodbye C'est exactement la raison.
ellockie
102
import os

path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
Luc
la source
2
Ce n'est pas récursif
Kyle Bridenstine
48

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

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)
Guillermo Pereira
la source
Ce n'est pas récursif
Kyle Bridenstine
32

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

ngeek
la source
3
C'est beaucoup plus rapide (environ la moitié du temps avec mes tests sur un répertoire de 10 000 fichiers) si vous connaissez le modèle que vous recherchez, plutôt que de tester chaque fichier avec os.path.isfile()comme la réponse acceptée. Aussi nettement plus rapide que glob.glob().
CivFan
14

Si vous voulez compter tous les fichiers du répertoire - y compris les fichiers des 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 une somme plus rapide que l'ajout explicite du nombre de fichiers (délais en attente)

Mr_and_Mrs_D
la source
1
Salut, j'essayais de comprendre ce code (le code fonctionne parfaitement), je sais que nous pouvons l'utiliser _en forboucle. os.walkaussi je sais. Mais sumje ne sais pas ce qui se passe avec les traits de soulignement à l'intérieur de la fonction, pourriez-vous développer. Merci!
Ejaz
1
Unsderscore n'est qu'un nom de variable @Ejaz, par convention utilisé lorsque nous ignorons la variable - c'est ce que nous faisons ici - nous appelons walk et ne comptons que le nombre de fichiers dans chaque répertoire, en ignorant les valeurs de retour de root et dirs walk
Mr_and_Mrs_D
12
import os
print len(os.listdir(os.getcwd()))
téméraire
la source
2
Cela peut être utile parfois, mais il inclut également des sous-répertoires
Brian Burns
10
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
ninjrok
la source
10

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

def count_files(dir):
    return len([1 for x in list(os.scandir(dir)) if x.is_file()])
qed
la source
Fonctionne très bien avec Python 3.6!
Aoki Ahishatsu
7

Cela utilise os.listdiret 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 rendu 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)))
joaquin
la source
5
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

Extrait de ce post

Kristian Damian
la source
2
1. filesest une liste. 2. OP ne recherche pas de décompte récursif
SilentGhost
4
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
tzot
la source
4

Reformatage du code de Luke.

import os

print len(os.walk('/usr/lib').next()[2])
okobaka
la source
4

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

print int(os.popen("ls | wc -l").read())
Bojan Tunguz
la source
L'analyse de la sortie de lsest généralement mal vue (elle peut souvent causer des problèmes), bien que ce ne soit pas une mauvaise méthode "rapide et sale" au niveau du shell. Vous devez utiliser ls -1, cependant, il garantit donc une ligne par fichier.
Bloodgain
3

Bien que je sois d'accord avec la réponse fournie par @DanielStutzbach: os.listdir()sera légèrement plus efficace que l'utilisation glob.glob.

Cependant, une précision supplémentaire, si vous souhaitez compter le nombre de fichiers spécifiques dans le dossier, vous souhaitez utiliser len(glob.glob()). Par exemple, si vous deviez compter tous les fichiers PDF dans un dossier que vous souhaitez utiliser:

pdfCounter = len(glob.glob1(myPath,"*.pdf"))
LBes
la source
2

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 la liste pour parcourir le répertoire spécifique renvoyant tous les fichiers en retour. "len (liste retournée)" renvoie le nombre de fichiers.

Agha Saad
la source
1
Bienvenue dans Stack Overflow. La qualité de cette réponse peut être améliorée en ajoutant une explication: Comment répondre
Elletlar
1
Merci Elletlar, j'ai édité ma réponse, je m'assurerai de répondre de manière plus complète: D
Agha Saad
1
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)
Mohit Dabas
la source
L'OP a demandé le nombre de fichiers , cela répertorie également les répertoires.
Korem
1

Si vous utilisez le shell standard du système d'exploitation, vous pouvez obtenir le résultat beaucoup plus rapidement plutôt que d'utiliser une méthode pythonique pure.

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))
styler
la source
1
Mais ce ne sera pas aussi portable.
Politank-Z
1

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) 
Ismail
la source
0

J'ai utilisé glob.iglobpour une structure de répertoires similaire à

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

Les deux options suivantes renvoient 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"))
user799188
la source
0

je l'ai fait et cela a renvoyé le nombre de fichiers dans le dossier (Attack_Data) ... cela fonctionne 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))
Sam Ekoro
la source