web-dev-qa-db-fra.com

Compter le nombre de fichiers avec une certaine extension dans Python

Je suis assez nouveau pour Python et j'essaie de trouver la façon la plus efficace de compter le nombre de fichiers .TIF dans un sous-répertoire particulier.

En faisant quelques recherches, j'ai trouvé un exemple (que je n'ai pas testé), qui prétendait compter tous les fichiers d'un répertoire:

file_count = sum((len(f) for _, _, f in os.walk(myPath)))

C'est très bien, mais je dois seulement compter les fichiers TIF. Mon répertoire contiendra d'autres types de fichiers, mais je veux seulement compter les TIF.

Actuellement, j'utilise le code suivant:

tifCounter = 0
for root, dirs, files in os.walk(myPath):
    for file in files:    
        if file.endswith('.tif'):
            tifCounter += 1

Cela fonctionne bien, mais le bouclage me semble excessif/cher. Une façon de le faire plus efficacement?

Merci.

35
Bryan Lewis

Quelque chose doit parcourir tous les fichiers du répertoire et regarder chaque nom de fichier - que ce soit votre code ou une routine de bibliothèque. Quelle que soit la solution spécifique, ils auront tous à peu près le même coût.

Si vous pensez que c'est trop de code, et si vous n'avez pas vraiment besoin de rechercher les sous-répertoires récursivement, vous pouvez utiliser le module glob:

import glob
tifCounter = len(glob.glob1(myPath,"*.tif"))
51
Martin v. Löwis

Pour ce cas d'utilisation particulier, si vous ne souhaitez pas effectuer de recherche récursive dans le sous-répertoire, vous pouvez utiliser os.listdir:

len([f for f in os.listdir(myPath) 
     if f.endswith('.tif') and os.path.isfile(os.path.join(myPath, f))])
7
tonfa

Votre code est très bien.

Oui, vous allez avoir besoin de boucler sur ces fichiers pour filtrer les fichiers .tif, mais boucler sur un petit tableau en mémoire est négligeable par rapport au travail de numérisation du répertoire de fichiers pour trouver ces fichiers en premier lieu, ce que vous devez faire de toute façon.

Je ne m'inquiéterais pas d'optimiser ce code.

5
Triptych

Si vous devez effectuer une recherche récursive ou, pour une autre raison, ne souhaitez pas utiliser le module glob, vous pouvez utiliser

file_count = sum(len(f for f in fs if f.lower().endswith('.tif')) for _, _, fs in os.walk(myPath))

C'est la façon "Pythonique" d'adapter l'exemple que vous avez trouvé à vos besoins. Mais cela ne sera pas beaucoup plus rapide ni plus efficace que la boucle que vous avez utilisée; c'est juste une syntaxe vraiment compacte pour plus ou moins la même chose.

3
David Z

essayez d'utiliser fnmatch https://docs.python.org/2/library/fnmatch.html

import fnmatch,os
num_files = len(fnmatch.filter(os.listdir(your_dir),'*.tif'))
print(num_files)
2
pyBomb