Sé un Pythonista: Recibe trucos Python y accede a nuestro espacio de Slack

Listar directorio en Python. Listar ficheros de un directorio

Listar directorio en Python
Share on facebook
Share on twitter
Share on linkedin

En este tutorial te voy a explicar varias formas de listar un directorio en Python para obtener los nombres de todos sus archivos y carpetas.

Para el tutorial, vamos a suponer un directorio de ejemplo cuyo contenido es el siguiente:

+ ejemplo
|_ + dir_a
     |_ fichero2.txt
     |_ fichero3.txt
|_ + dir_b
     |_ fichero4.txt
|_ documento.txt
|_ fichero1.txt
|_ imagen.jpg

Índice

Listar directorio en Python con listdir()

Para listar o recorrer un directorio en Python basta con usar la función listdir() del módulo os. Esta función recibe como argumento una ruta del sistema de ficheros y devuelve una lista con los nombres de los archivos y carpetas que contiene. Si no se pasa ningún argumento, el directorio de referencia es la carpeta actual.

>>> import os
>>> contenido = os.listdir('/Users/Juanjo/ejemplo')
>>> contenido
['documento.txt', 'imagen.jpg', 'dir_b', 'fichero1.txt', 'dir_a']

El problema de usar la función listdir() es que no permite distinguir si los objetos listados son ficheros o directorios. Para ello, debemos usar otras funciones como isfile() o isdir() del módulo os.path. Por ejemplo, para mostrar los archivos que son de tipo jpg deberías hacer algo como lo siguiente:

import os

ejemplo_dir = '/Users/Juanjo/ejemplo/'

contenido = os.listdir(ejemplo_dir)

imagenes = []
for fichero in contenido:
    if os.path.isfile(os.path.join(ejemplo_dir, fichero)) and fichero.endswith('.jpg'):
        imagenes.append(fichero)
print(imagenes)

El resultado de ejecutar el script anterior sobre el directorio de prueba es:

['imagen.jpg']

Recorrer directorio en Python con scandir()

Si debes filtrar de algún modo los elementos devueltos por listdir(), la mejor forma de recorrer un directorio en Python es usar la función scandir(), contenida también en el módulo os.

🎯 NOTA: La función fue añadida en la versión 3.5 de Python. Actualmente, es la forma recomendada por el propio Python para recorrer un directorio.

Esta función actúa realmente como un iterador en lugar de devolver una lista. Además, no solo recupera los nombres de fichero sino que devuelve objetos de tipo DirEntry que, además del nombre, contienen otros atributos que indican si el objeto es un fichero, un directorio, su número inode o su ruta completa.

Veamos un ejemplo de uso de scandir() para listar los ficheros de un directorio en Python (el directorio del ejemplo):

import os

ejemplo_dir = '/Users/Juanjo/ejemplo/'

with os.scandir(ejemplo_dir) as ficheros:
    for fichero in ficheros:
        print(fichero.name)

El resultado de este script es:

documento.txt
imagen.jpg
dir_b
fichero1.txt
dir_a

Como has podido comprobar, scandir() se utiliza en combinación con la sentencia with ya que soporta manejadores de contexto. Al ejecutar scandir() junto con with, se cierra el iterador y se liberan todos los recursos utilizados por este una vez finaliza.

Listar ficheros de un directorio con iterdir()

Otro módulo Python que ofrece funcionalidad para iterar sobre un directorio y recorrer su contenido es pathlib. Este módulo ofrece una serie de objetos y recursos que permiten realizar la mayoría de operaciones comunes sobre ficheros y directorios de forma fácil y eficiente.

Para listar un directorio con pathlib hay que crear un objeto Path que, en función del sistema operativo en que nos encontremos, será realmente de tipo PosixPath o WindowsPath.

Estos objetos Path tienen un método llamado iterdir() que crea un iterador que recorre todos los archivos y carpetas de un directorio. Además, los objetos de clase Path contienen propiedades como name, con el nombre del fichero, y métodos como is_file() o is_dir(), que permiten comprobar si un fichero es un archivo o un directorio.

Veamos a continuación un ejemplo de uso de pathlib:

import pathlib

ejemplo_dir = '/Users/Juanjo/ejemplo/'
directorio = pathlib.Path(ejemplo_dir)
for fichero in directorio.iterdir():
    print(fichero.name)

El resultado de este script es:

documento.txt
imagen.jpg
dir_b
fichero1.txt
dir_a

Métodos recomendados

Una vez que hemos visto tres formas diferentes para recorrer un directorio en Python, te diré que las opciones recomendadas son, bien utilizar la función scandir(), bien usar el método iterdir() de pathlib.

Ejemplos

A partir de aquí veremos cómo aplicar filtros para recorrer solo los ficheros, solo determinados ficheros o solo los subdirectorios de un directorio dado.

Recorrer los ficheros de un directorio con scandir

import os

ejemplo_dir = '/Users/Juanjo/ejemplo/'

with os.scandir(ejemplo_dir) as ficheros:
    ficheros = [fichero.name for fichero in ficheros if fichero.is_file()]

print(ficheros)

Resultado:

['documento.txt', 'imagen.jpg', 'fichero1.txt']

Para recorrer solo los ficheros de tipo jpg, se puede añadir una condición más:

with os.scandir(ejemplo_dir) as ficheros:
    ficheros = [fichero.name for fichero in ficheros if fichero.is_file() and fichero.name.endswith('.jpg')]

Recorrer los ficheros de un directorio con iterdir

import pathlib

ejemplo_dir = '/Users/Juanjo/ejemplo/'

directorio = pathlib.Path(ejemplo_dir)
ficheros = [fichero.name for fichero in directorio.iterdir() if fichero.is_file()]

Listar los subdirectorios de un directorio con scandir

import os

ejemplo_dir = '/Users/Juanjo/ejemplo/'

with os.scandir(ejemplo_dir) as ficheros:
    subdirectorios = [fichero.name for fichero in ficheros if fichero.is_dir()]

print(subdirectorios)

Resultado:

['dir_b', 'dir_a']

Listar los subdirectorios de un directorio con iterdir

import pathlib

ejemplo_dir = '/Users/Juanjo/ejemplo/'

directorio = pathlib.Path(ejemplo_dir)
ficheros = [fichero.name for fichero in directorio.iterdir() if fichero.is_dir()]

Si te ha resultado útil, compártelo con tus amigos 🤗

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn

Sé un Pythonista: Recibe trucos Python y accede a nuestro espacio de Slack

También te puede interesar

* Te informo de que los datos de carácter personal que proporciones al comentar serán tratados por Juan José Lozano Gómez como responsable de esta web. La Finalidad es moderar los comentarios. La Legitimación es gracias a tu consentimiento. Destinatarios: tus datos se encuentran alojados en Disqus (disqus.com), mi sistema de comentarios, que está acogido al acuerdo de seguridad EU-US Privacy. Podrás ejercer Tus Derechos de Acceso, Rectificación, Limitación o Suprimir tus datos enviando un email a juanjo@j2logo.com. Encontrarás más información en la POLÍTICA DE PRIVACIDAD.

Sobre j2logo

Quiero ayudarte a que seas mejor programador/a, pero no uno cualquiera, sino uno de los top.

Últimos posts

¿Quieres ser un auténtico Pythonista? 🐍

📩 Recibe de vez en cuando trucos, scripts y tutoriales Python en español para dominar el lenguaje. No es SPAM. Date de baja cuando quieras

🥇 Accede a nuestra comunidad privada de Slack: Pythonistas-es

* Al enviar el formulario confirmas que aceptas la POLITICA DE PRIVACIDAD

Pythonistas-es

SÉ UN AUTÉNTICO PYTHONISTA

📩 Recibe trucos, scripts y tutoriales Python

🥇 Accede a nuestra comunidad privada de Slack