2014-09-04 32 views
19

Ho cercato ovunque questa risposta ma non la trovo.Come verificare se una cartella contiene file usando python 3

Sto provando a creare uno script che cercherà una sottocartella particolare, quindi controlla se contiene file e, in caso affermativo, scrive il percorso della cartella. Ho trovato la parte di ricerca nella sottocartella, ma il controllo dei file mi ha bloccato.

Ho trovato più suggerimenti su come verificare se una cartella è vuota e ho provato a modificare gli script per verificare se la cartella non è vuota, ma non ottengo i risultati corretti.

Ecco lo script che è venuto il più vicino:

for dirpath, dirnames, files in os.walk('.'): 
if os.listdir(dirpath)==[]: 
    print(dirpath) 

Questo elenco di tutte le sottocartelle che sono vuoti, ma se provo a cambiare a:

if os.listdir(dirpath)!=[]: 
    print(dirpath) 

che verrà elencare tutto --non solo quelle sottocartelle contenenti file.

Apprezzerei molto se qualcuno potesse indicarmi la giusta direzione.

Questo è per Python 3.4, se questo è importante.

Grazie per l'aiuto che mi puoi dare.

+1

Con "vuoto" intendi "non contiene nulla (eccetto' .' e '..')", o "non contiene nient'altro che sottodirectory", o "non contiene file regolari" o "non contiene file normali non nascosti" o qualcosa di diverso? – abarnert

+1

Nel frattempo, perché stai usando 'os.walk' e poi anche usando' os.listdir' su ogni 'dirpath'?Hai già i 'dirnames' e' files'; perché chiamare una funzione per ottenere le stesse informazioni che hai già? – abarnert

+1

Infine, quasi mai si desidera controllare '! = []' O '== []'. Basta usare il fatto che le sequenze vuote sono false, mentre le sequenze non vuote sono verità: 'se non os.listdir (dirpath):' farebbe quello che vuoi. – abarnert

risposta

13

"file" indica già che cosa è nella directory. Basta controllare che:

for dirpath, dirnames, files in os.walk('.'): 
    if files: 
     print(dirpath, 'has files') 
    if not files: 
     print(dirpath, 'is empty') 
+0

Mi piacerebbe che stampasse solo quei percorsi che hanno file. Voglio ignorare quei percorsi che non hanno file. Se questo può essere modificato per stampare solo quei percorsi che hanno file, allora sarebbe esattamente quello di cui ho bisogno. – Heather

+0

Duh - Ho appena capito di rimuovere la riga "se non" dal codice e ho ottenuto esattamente ciò di cui avevo bisogno. Grazie a tutti per il vostro aiuto da questo principiante a Python. :) – Heather

+0

LOL - ha mostrato entrambi perché hai avuto '==' e '! =' Esempi nel tuo codice. Avrei potuto essere più chiaro – tdelaney

3
entities = os.listdir(dirpath) 
for entity in entities: 
    if os.path.isfile(entity): 
     print(dirpath) 
     break 
8

Si può fare uso della nuova pathlib biblioteca introdotto in Python 3.4 per estrarre tutte le sottodirectory non vuoti in modo ricorsivo, per esempio:

import pathlib 

root = pathlib.Path('some/path/here') 
non_empty_dirs = {str(p.parent) for p in root.rglob('*') if p.is_file()} 

Dal momento che si deve camminare l'albero in ogni caso , creiamo un set di directory madri in cui è presente un file che produce un insieme di directory che contengono file, quindi esegui come desideri con il risultato.

1

Se è possibile eliminare la cartella, è possibile utilizzare questo:

try: 
    os.rmdir(submodule_absolute_path) 
    is_empty = True 

except OSError: 
    is_empty = False 

if is_empty: 
    pass 

L'os.rmdir rimuove solo una cartella se è vuota, altrimenti si genera l'eccezione OSError.

Si può trovare una discussione su questo su:

  1. https://bytes.com/topic/python/answers/157394-how-determine-if-folder-empty

Ad esempio, l'eliminazione di una cartella vuota va bene quando state programmando di fare un clone git, ma si sta verificando in anticipo se la cartella è vuota quindi git non lancia l'errore di cartella non vuota.

Problemi correlati