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?
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?
Risposte:
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))])
folder_pathinterno os.path.filename(name)se non sei nel CWD. stackoverflow.com/questions/17893542/…
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?
import os
path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
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)
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
os.path.isfile()la risposta accettata. Anche significativamente più veloce di glob.glob().
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)
_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!
import os
print len(os.listdir(os.getcwd()))
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()])
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)))
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
filesè un elenco. 2. OP non sta cercando un conteggio ricorsivo
Ecco un semplice comando a una riga che ho trovato utile:
print int(os.popen("ls | wc -l").read())
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.
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"))
È 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.
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)
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))
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)
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"))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))