2010-10-07 10 views

risposta

27

Per contare file e directory in modo non ricorsivo è possibile utilizzare os.listdir e prendere la sua lunghezza.

Per contare i file e le directory in modo ricorsivo è possibile utilizzare os.walk per scorrere i file e le sottodirectory nella directory.

Se si desidera solo per contare i file non directory è possibile utilizzare os.listdir e os.path.file per controllare se ogni voce è un file:

import os.path 
path = '.' 
num_files = len([f for f in os.listdir(path) 
       if os.path.isfile(os.path.join(path, f))]) 

Oppure, in alternativa utilizzando un generatore:

num_files = sum(os.path.isfile(os.path.join(path, f)) for f in os.listdir(path)) 

Oppure si possibile utilizzare os.walk come segue:

len(os.walk(path).next()[2]) 

Ho trovato alcune di queste idee da this thread.

6

È possibile utilizzare il modulo glob:

>>> import glob 
>>> print len(glob.glob('/tmp/*')) 
10 

Oppure, come suggerisce Mark Byers nella sua risposta, se desideri solo file:

>>> print [f for f in glob.glob('/tmp/*') if os.path.isfile(f)] 
['/tmp/foo'] 
>>> print sum(os.path.isfile(f) for f in glob.glob('/tmp/*')) 
1 
+0

Va detto, che 'os.listdir ('. ')' Include i file nascosti (a partire da un singolo punto), mentre 'glob (' ./* ') 'non lo fa. – lunaryorn

+0

@lunaryorn - Se vuoi i file nascosti nella directory corrente, usa 'glob ('. *')'. Se vuoi tutto compreso i file nascosti, usa 'glob ('. *') + Glob ('*')'. – bstpierre

5

risposta di Marco Byer è semplice, elegante, e va d'accordo con lo spirito pitone.

C'è un problema, però: "". Se si tenta di eseguire che per ogni altra directory che, fallirà, in quanto os.listdir() restituisce i nomi dei file, non il percorso completo. Questi due sono gli stessi quando si elenca la directory di lavoro corrente, quindi l'errore non viene rilevato nella sorgente sopra.

Ad esempio, se in "/ home/me" e si elenca "/ tmp", si otterrà (diciamo) ['flashXVA67']. Proverai "/ home/me/flashXVA67" invece di "/ tmp/flashXVA67" con il metodo sopra.

È possibile risolvere questo usando os.path.join(), in questo modo:

import os.path 
path = './whatever' 
count = len([f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]) 

Inoltre, se avete intenzione di fare questo conteggio molto e richiedono le prestazioni, si consiglia di fare senza generare elenchi aggiuntivi. Ecco un meno elegante, ma efficace soluzione unpythonesque:

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 


# The following line prints the number of files in the current directory: 
path = "./whatever" 
print fcount(path) 
+0

dai un'occhiata alla risposta di bstpierre. – SilentGhost

+0

Davvero! Sembra migliore del mio, e se stai leggendo questo, controlla la prima risposta, l'aggiunta è stata fatta da Mark usando walk() che risolve entrambi i problemi che ho evidenziato in una singola riga. – slezica

+0

+1 per individuare il bug - Ho aggiornato la mia risposta con la versione corretta. –

0
total = len(filter(
      lambda f: os.path.isfile(os.path.join(path_to_dir, f)), 
      os.listdir(path_to_dir))) 

O

total = sum([True for f in os.listdir(path_to_dir) if os.path.isfile(os.path.join([path_to_dir, f)]) 
0

pathlib, che è nuovo in v 3.4, rende più facile come.. La riga con etichetta crea un elenco non ricorsivo della cartella corrente, quella denominata l'elenco ricorsivo.

from pathlib import Path 

import os 
os.chdir('c:/utilities') 

print (len(list(Path('.').glob('*')))) ## 1 
print (len(list(Path('.').glob('**/*')))) ## 2 

Ci sono anche altre prelibatezze.Con queste righe aggiuntive è possibile visualizzare sia i nomi di file assoluti e relativi per quegli elementi che sono file.

for item in Path('.').glob('*'): 
    if item.is_file(): 
     print (str(item), str(item.absolute())) 

Risultato:

boxee.py c:\utilities\boxee.py 
boxee_user_catalog.sqlite c:\utilities\boxee_user_catalog.sqlite 
find RSS.py c:\utilities\find RSS.py 
MyVideos34.sqlite c:\utilities\MyVideos34.sqlite 
newsletter-1 c:\utilities\newsletter-1 
notes.txt c:\utilities\notes.txt 
README c:\utilities\README 
saveHighlighted.ahk c:\utilities\saveHighlighted.ahk 
saveHighlighted.ahk.bak c:\utilities\saveHighlighted.ahk.bak 
temp.htm c:\utilities\temp.htm 
to_csv.py c:\utilities\to_csv.py 
Problemi correlati