¿Cómo puedo enumerar el contenido de un directorio en Python?

188

No puede ser difícil, pero estoy teniendo un bloqueo mental.

Paul D. Waite
fuente

Respuestas:

262
import os
os.listdir("path") # returns list
usuario85461
fuente
52

De una sola mano:

import os
os.listdir("/home/username/www/")

Otra forma :

glob.glob("/home/username/www/*")

Ejemplos encontrados aquí .

El glob.globmétodo anterior no enumerará los archivos ocultos.

Desde que originalmente respondí esta pregunta hace años, pathlib se ha agregado a Python. Mi forma preferida de listar un directorio ahora generalmente implica el iterdirmétodo en Pathobjetos:

from pathlib import Path
print(*Path("/home/username/www/").iterdir(), sep="\n")
Trey Hunner
fuente
¿Glob.glob enumeraría archivos ocultos (supongo que se refiere a .XYZarchivos en un contexto de sistema de archivos Unix), cuando se usa con glob.glob("/home/username/www/.*")?
Andy Finkenstadt
Sí, me refiero a los archivos que comienzan con un punto. El ejemplo que dio funcionaría para hacer coincidir los archivos ocultos (y solo los archivos ocultos).
Trey Hunner
Acabo de importar glob y usé glob.glob (r'c: \ users ') pero solo regresó['c:\\users']
Musixauce3000
1
@ Musixauce3000: querrá hacerlo glob.glob(r'c:\users\*')(globalmente, en realidad no enumera los directorios, pero expande los asteriscos y demás, lo que lleva a cabo una tarea similar).
Trey Hunner
38

os.walk se puede usar si necesita recurrencia:

import os
start_path = '.' # current directory
for path,dirs,files in os.walk(start_path):
    for filename in files:
        print os.path.join(path,filename)
Mark Tolonen
fuente
18

glob.globo os.listdirlo haremos.

Tuomas Pelkonen
fuente
import globENTER glob.glob(r'c:\users')ENTER solo parece regresar ['c:\\users']. ¿Porqué es eso? Me gustaría usar glob.glob porque, como han señalado otros usuarios, supuestamente devuelve el contenido de un directorio e ignora también los archivos ocultos. Esto es importante.
Musixauce3000
porque debe especificar un comodín con glob:glob.glob(r'c:\users\*')
Jean-François Fabre
14

El osmódulo maneja todas esas cosas.

os.listdir(path)

Devuelve una lista que contiene los nombres de las entradas en el directorio dado por ruta. La lista está en orden arbitrario. No incluye las entradas especiales '.' y '...' incluso si están presentes en el directorio.

Disponibilidad: Unix, Windows.

zdav
fuente
4

En Python 3.4+, puede usar el nuevo pathlibpaquete:

from pathlib import Path
for path in Path('.').iterdir():
    print(path)

Path.iterdir()devuelve un iterador, que puede convertirse fácilmente en un list:

contents = list(Path('.').iterdir())
jpyams
fuente
3

Desde Python 3.5, puedes usar os.scandir.

La diferencia es que devuelve entradas de archivo , no nombres. En algunos sistemas operativos como Windows, significa que no tiene que os.path.isdir/filesaber si es un archivo o no, y eso ahorra tiempo de CPU porque statya está hecho al escanear el directorio en Windows:

ejemplo para listar un directorio e imprimir archivos más grandes que max_valuebytes:

for dentry in os.scandir("/path/to/dir"):
    if dentry.stat().st_size > max_value:
       print("{} is biiiig".format(dentry.name))

(lea una extensa respuesta mía basada en el rendimiento aquí )

Jean-François Fabre
fuente
2

El siguiente código enumerará los directorios y los archivos dentro del directorio. El otro es os.walk

def print_directory_contents(sPath):
        import os                                       
        for sChild in os.listdir(sPath):                
            sChildPath = os.path.join(sPath,sChild)
            if os.path.isdir(sChildPath):
                print_directory_contents(sChildPath)
            else:
                print(sChildPath)
Heenashree Khandelwal
fuente