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?
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))])
import os
path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
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)
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
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
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)))
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()])
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)
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
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
Reformater le code de Luke.
import os
print len(os.walk('/usr/lib').next()[2])
Voici une simple commande d'une ligne que j'ai trouvée utile:
print int(os.popen("ls | wc -l").read())
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)
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))
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)
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"))
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))
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.