2011-06-02 37 views
38

Todo,Encontrar directorios vacíos en Python

¿Cuál es la mejor manera de comprobar para ver si hay datos en un directorio antes de eliminarlo? Estoy navegando por un par de páginas para encontrar algunas fotos usando wget y, por supuesto, cada página no tiene una imagen, pero el directorio aún se crea.

dir = 'Files\\%s' % (directory) 
os.mkdir(dir) 
cmd = 'wget -r -l1 -nd -np -A.jpg,.png,.gif -P %s %s' %(dir, i[1]) 
os.system(cmd) 
if not os.path.isdir(dir): 
    os.rmdir(dir) 

Me gustaría probar para ver si un archivo se colocó en el directorio después de haber sido creado. Si no hay nada allí ... eliminarlo.

Gracias, Adam

+0

Define "empty". ¿Qué pasa si hay subdirectorios? ¿Se deberían verificar los datos? ¿Deberían también eliminarse si no hay datos en ellos? – kwatford

+0

No tengo ningún subdirectorio en este caso solo una carpeta que puede o no tener fotos. – aeupinhere

+3

No use os.system para llamar a wget. Utilice el subproceso.Popen –

Respuesta

17

Probar:

if not os.listdir(dir): 
    print "Empty" 

o

if os.listdir(dir) == []: 
    print "Empty" 
47
import os 

if not os.listdir(dir): 
    os.rmdir(dir) 

LBYL estilo.
para EAFP, vea la respuesta de mouad.

1

¿Qué pasa si usted hizo comprobado si el directorio existe, y si existe contenido en el directorio ... algo así como:

if os.path.isdir(dir) and len(os.listdir(dir)) == 0: 
    os.rmdir(dir) 
41

voy a ir con EAFP así:

try: 
    os.rmdir(dir) 
except OSError as ex: 
    if ex.errno == errno.ENOTEMPTY: 
     print "directory not empty" 

NB: os.rmdir no elimine el directorio que no está vacío.

+2

+1: Simple. Directo. Y delega ** todas ** las decisiones difíciles al sistema operativo al que pertenece. –

+1

Tenga en cuenta que esta función elimina silenciosamente todos los demás errores (como 'EACCESS'), que es posible que desee informar. Tenga en cuenta que corregirlo ingenuamente probablemente resultaría en errores de informe para directorios no vacíos, que probablemente quiera ignorar. No es tan simple como parece :-) –

+2

¿Qué tal 'else: raise'? – spectras

1

Si los directorios vacíos ya están creadas, puede colocar este script en el directorio externo y ejecutarlo:

import os 

def _visit(arg, dirname, names): 
    if not names: 
     print 'Remove %s' % dirname 
     os.rmdir(dirname) 

def run(outer_dir): 
    os.path.walk(outer_dir, _visit, 0) 

if __name__ == '__main__': 
    outer_dir = os.path.dirname(__file__) 
    run(outer_dir) 
    os.system('pause') 
-1
import os 
import tempfile 

root = tempfile.gettempdir() 
EMPTYDIRS = [] 

for path, subdirs, files in os.walk(r'' + root): 
    if len(files) == 0 and len(subdirs) == 0: 
     EMPTYDIRS.append(path) 

for e in EMPTYDIRS: 
    print e 
1

Esto ahora se puede hacer de manera más eficiente en python3, ya que no hay necesidad para compilar una lista del contenido del directorio para ver si está vacío:

import os 

def is_dir_empty(path): 
    return next(os.scandir(path), None) is None 
Cuestiones relacionadas