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?


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))])

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)

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)

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


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)


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()))

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

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()])

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)))

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


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

4

Reformatage du code de Luke.

import os

print len(os.walk('/usr/lib').next()[2])

4

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

print int(os.popen("ls | wc -l").read())

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"))

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.


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)

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))

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) 

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"))

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))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.