Come contare il numero di file in una directory usando Python


224

Devo contare il numero di file in una directory usando Python.

Immagino che il modo più semplice sia len(glob.glob('*')), ma questo conta anche la directory stessa come file.

C'è un modo per contare solo i file in una directory?


Per tralasciare le directory, puoi fare '* .fileextension' per qualsiasi estensione di file tu stia cercando.

Risposte:


275

os.listdir()sarà leggermente più efficiente dell'uso glob.glob. Per verificare se un nome file è un file ordinario (e non una directory o altra entità), utilizzare 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
Ricorda di aggiungere l' folder_pathinterno os.path.filename(name)se non sei nel CWD. stackoverflow.com/questions/17893542/…
Rafael Oliveira,

1
Questo non conta il file all'interno di cartelle nidificate.
codersofthedark,

5
Per il conteggio ricorsivo dei file nidificati all'interno delle directory, potresti stare meglio con la soluzione os.walk ().
Gioele B,

Qual è il vantaggio dell'utilizzo di os.path.join(DIR, name)over DIR + '/' + name? Quest'ultima è più corta e, IMO, più chiara della prima. C'è forse qualche sistema operativo: es su cui quest'ultimo fallirebbe?
Ciao Arrivederci,

@HelloGoodbye Questo è esattamente il motivo.
ellockie,


48

Per tutti i tipi di file, le sottodirectory incluse:

import os

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

Solo file (evitando le sottodirectory):

import os

onlyfiles = next(os.walk(dir))[2] #dir is your directory path as string
print len(onlyfiles)

Questo non è ricorsivo
Kyle Bridenstine,

32

Qui è dove fnmatch è molto utile:

import fnmatch

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

Maggiori dettagli: http://docs.python.org/2/library/fnmatch.html


3
Questo è molto più veloce (circa la metà dei miei test su una directory con 10.000 file) se conosci lo schema che stai cercando, piuttosto che testare ogni file con os.path.isfile()la risposta accettata. Anche significativamente più veloce di glob.glob().
CivFan,

14

Se vuoi contare tutti i file nella directory, inclusi i file nelle sottodirectory, il modo più pitonico è:

import os

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

Usiamo la somma che è più veloce dell'aggiunta esplicita del conteggio dei file (tempi in sospeso)


1
Ciao, stavo cercando di capire questo codice (il codice funziona perfettamente), so che possiamo usarlo _in un forciclo. os.walkanche io lo so. Ma non sumsei sicuro di cosa stia succedendo con i trattini bassi all'interno della funzione, potresti per favore elaborare. Grazie!
Ejaz,

1
Unsderscore è solo un nome di variabile @Ejaz, per convenzione utilizzato quando ignoriamo la variabile - questo è ciò che facciamo qui - chiamiamo walk e contiamo solo il numero di file in ogni directory, ignorando i valori di ritorno di root e dirs walk
Mr_and_Mrs_D


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

Sono sorpreso che nessuno abbia menzionato os.scandir:

def count_files(dir):
    return len([1 for x in list(os.scandir(dir)) if x.is_file()])

Funziona alla grande con Python 3.6!
Aoki Ahishatsu,

7

Questo utilizza os.listdire funziona per qualsiasi directory:

import os
directory = 'mydirpath'

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

questo può essere semplificato con un generatore e reso un po 'più veloce con:

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

Tratto da questo post


2
1. filesè un elenco. 2. OP non sta cercando un conteggio ricorsivo
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

Riformato del codice di Luca.

import os

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

4

Ecco un semplice comando a una riga che ho trovato utile:

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

L'analisi dell'output di lsè generalmente disapprovata (può spesso causare problemi), sebbene questo non sia un cattivo metodo "rapido e sporco" nella shell. Dovresti usare ls -1, tuttavia, in modo da garantire una riga per file.
Bloodgain

3

Concordo con la risposta fornita da @DanielStutzbach: os.listdir()sarà leggermente più efficiente dell'uso glob.glob.

Tuttavia, una precisione in più, se si desidera contare il numero di file specifici nella cartella, si desidera utilizzare len(glob.glob()). Ad esempio, se dovessi contare tutti i pdf in una cartella che desideri utilizzare:

pdfCounter = len(glob.glob1(myPath,"*.pdf"))

2

È semplice:

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

conta semplicemente il numero di file nella directory, ho usato la tecnica di comprensione dell'elenco per scorrere attraverso la directory specifica restituendo tutti i file in cambio. "len (lista restituita)" restituisce il numero di file.


1
Benvenuto in Stack Overflow. La qualità di questa risposta può essere migliorata aggiungendo una spiegazione: Come rispondere
Elletlar,

1
Grazie Elletlar, ho modificato la mia risposta, mi assicurerò di rispondere in modo più completo: 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 ha richiesto il numero di file , elenca anche le directory.
Korem,

1

Se utilizzerai la shell standard del sistema operativo, puoi ottenere il risultato molto più velocemente invece di usare la pura modalità pitonica.

Esempio per 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
Ma non sarà portatile.
Politank-Z,

1

Ho trovato un'altra risposta che potrebbe essere corretta come risposta accettata.

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

Ho usato glob.iglobper una struttura di directory simile a

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

Entrambe le seguenti opzioni restituiscono 4 (come previsto, ovvero non conteggiano le sottocartelle stesse )

  • len(list(glob.iglob("data/train/*/*.png", recursive=True)))
  • sum(1 for i in glob.iglob("data/train/*/*.png"))

0

l'ho fatto e questo ha restituito il numero di file nella cartella (Attack_Data) ... funziona benissimo.

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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.