2011-08-17 18 views
49

Il mio script python esegue uno os.listdir(path) in cui il percorso è una coda contenente archivi che devo trattare uno per uno.Come ignorare i file nascosti usando os.listdir()?

Il problema è che sto recuperando la lista in un array e quindi faccio semplicemente un semplice array.pop(0). Sta funzionando bene fino a quando ho messo il progetto in sovversione. Ora ottengo la cartella .svn nel mio array e, ovviamente, fa crash la mia applicazione.

Quindi, ecco la mia domanda: esiste una funzione esistente che ignora i file nascosti quando si esegue un os.listdir() e se no quale sarebbe il modo migliore?

Grazie.

risposta

60

è possibile scrivere uno voi stessi:

def listdir_nohidden(path): 
    for f in os.listdir(path): 
     if not f.startswith('.'): 
      yield f 

Oppure è possibile utilizzare un glob:

def listdir_nohidden(path): 
    return glob.glob(os.path.join(path, '*')) 

Uno di questi sarà ignorare tutti i nomi di file che iniziano con '.'.

+1

la funzione proposto 'listdir_nohidden' non è del tutto compatibile con' os.listdir', dal momento che l'uso di 'yield' lo rende un generatore. Invece dovrebbe scorrere l'elenco di output da 'os.listdir' e rimuovere le voci che iniziano con '.' – 0sh

+1

@ 0sh: Perché è necessario rimuovere le cose sul posto? Basta definire una nuova funzione che 'elenca (listdir_nohidden (path))' e quella nuova funzione è esattamente compatibile con 'os.listdir'. – abarnert

10

glob:

>>> import glob 
>>> glob.glob('*') 

(. glob pretese di utilizzare listdir e fnmatch sotto il cofano, ma controlla anche per un leader '.', non utilizzando fnmatch)

13

su Windows, Linux e OS X:

if os.name == 'nt': 
    import win32api, win32con 


def folder_is_hidden(p): 
    if os.name== 'nt': 
     attribute = win32api.GetFileAttributes(p) 
     return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM) 
    else: 
     return p.startswith('.') #linux-osx 
+2

dovrebbe funzionare anche su un Mac, i file nascosti iniziano da '.' anche. –

+0

Questa è l'unica risposta portatile, ottimo lavoro, ma le altre risposte forniscono un wrapper completo per os.listdir quindi ... '[f per f in os.listdir (percorso) se non folder_is_hidden (f)]' – SensorSmith

12
filter(lambda f: not f.startswith('.'), os.listdir('.')) 
13

Questa è una vecchia questione, ma sembra che manca la risposta ovvia di utilizzare l'elenco di comprensione, quindi sto aggiungendo qui per completezza:

[f for f in os.listdir(path) if not f.startswith('.')] 

Come nota laterale, la documentazione stato listdir tornerà risultati in 'ordine arbitrario' tuttavia il caso di utilizzo comune è di avere loro ordine alfabetico. Se si desidera che il contenuto della directory in ordine alfabetico, senza riguardo a capitalizzazione, è possibile utilizzare:

sorted([f for f in os.listdir('./')], key=lambda f: f.lower()) 
0
filenames = (f.name for f in os.scandir() if not f.name.startswith('.')) 
Problemi correlati