Módulo Pathlib Python



@eduardo_gpg

Número de visitas 1863

Tiempo de lectura 3 min

15 Junio 2021

En una entrega anterior aprendimos a manejar archivos de nuestro sistema utilizando Python. 🐍 Si bien, en dicho post mencionamos el módulo pathlib no ahondamos mucho en él. Por lo tanto, en este nuevo post nos enfocaremos completamente en el uso de este módulo, con el cual, te adelanto, seremos capaces de trabajar con rutas, link y archivos en nuestro sistema de una forma extremadamente sencilla. 😎

Bien, sin más introducción, comencemos con el post.

Pathlib

Comencemos con lo esencial. Verás, el módulo pathlib es un módulo que se encuentra dentro de la biblioteca estándar de Python, por lo cual para utilizarlo no hay necesidad de instalar absolutamente nada.

Este módulo fue añadido al lenguaje a partir de la versión 3.4 de Python, así que, si te encuentras utilizando una versión anterior del lenguaje es probable que no puedas continuar con este tutorial. Te recomiendo que actualices. 😦


Bien, lo primero que haremos será conocer la ruta donde nos encontramos actualmente.

>>> from pathlib import Path

>>> Path.cwd()
PosixPath('/home/eduardo/projects/blue')

Utilizando el método cwd de la clase Path seremos capaces de conocer la ruta en nuestro sistema donde nos encontramos, es decir, la ruta donde se ejecuto el comando. Esto es equivalente al comando pwd de unix.

De igual forma, utilizando la clase Path, seremos capaces de representar directorios. Para ello basta con pasar como argumento un string que haga referencia a la ruta de nuestro sistema. 🧐

>>> path= Path('/home/eduardo/projects/examples/python/async')

>>> path
PosixPath('/home/eduardo/projects/examples/python/async')

Obtendremos como resultado un objeto de tipo PosixPath.

A partir del objeto seremos capaces de conocer si la ruta hace referencia a una archivo o folder.

>>> path.is_dir()
True

>>> path.is_file()
False

Utilizando el objeto PosixPath seremos capaces de conocer información relevante con respecto al directorio, esto mediante sus diferentes atributos. Aquí algunos de ellos.

>>> path = Path('/home/eduardo/projects/examples/python/async/main.py')

>>> path
PosixPath('/home/eduardo/projects/examples/python/async/main.py')

>>> path.name
'main.py'

>>> path.stem
'main'

>>> path.suffix
'.py'

>>> path.parent
PosixPath('/home/eduardo/projects/examples/python/async')

>>> path.parent.name
'async'

>>> path.anchor
'/'

# Tupla con cada una de las parte que conforma la ruta
>>> path.parts
('/', 'home', 'eduardo', 'projects', 'examples', 'python', 'async')

Ojo, es importante mencionar que, es posible crear objetos de tipo PosixPath a partir de una ruta invalida, es por ello que lo recomendable antes de acceder a cualquier atributo del objeto o utilizar alguno de sus métodos, es validar que en efecto el directorio exista dentro del sistema, y para ello podemos hacer uso del método exists.

>>> path = Path('/home/eduardo/projects/examples/python/async/main.py')
>>> path.exists()
True

>>> path = Path('/home/eduardo/projects/examples/python/async/undefined.py')
>>> path.exists()
False

Aquí otro ejemplo.

directory = Path('/home/eduardo/projects/examples/python/async')
path = directory / 'main.py'

if not path.exists():
    print('Lo sentimos, el directorio no es valido')

Lo interesante de este segundo ejemplo es observar como es posible crear nuevas rutas utilizando un objeto PosixPath como base. Basta con unir el o los directorios utilizando el carácter slash (/).

Aquí un par de ejemplos.

>>> directory = Path('/home/eduardo/projects/examples/')

>>> directory / 'python'
PosixPath('/home/eduardo/projects/examples/python')


>>> directory / 'python' / 'async'
PosixPath('/home/eduardo/projects/examples/python/async')

>>> directory / 'python' / 'async' / 'main.py'
PosixPath('/home/eduardo/projects/examples/python/async/main.py')

Este es, por mucho, mi features favorito de pathlib. 😃 Ya que con el uso de slash para generar nuevas rutas ya nos podemos ir olvidando del tedioso join de os. 😛

os.path.join(path, "User/Desktop", "file.txt")

Operaciones con directorios

Ok, hasta este punto ya sabemos representar directorios de nuestro sistema utilizando objetos de tipo PosixPath, sin embargo déjame decirte que aun podemos realizar muchas, muchas operaciones más con estos objetos. Veamos un par de ejemplos.

Listamos todos los directorios que se encuentren dentro de un folder de nuestro sistema.

main.py

from pathlib import Path

path = Path('/home/eduardo/projects/examples/python/async') 

if path.exists():
    for dir in path.iterdir():
        print(dir)

Salida:

/home/eduardo/projects/examples/python/async/main.py
/home/eduardo/projects/examples/python/async/env

Para este ejemplo listamos tanto archivos como sub carpetas. Ahora, en caso solo quisiéramos listar alguno de ellos, (Solo archivos o Solo carpetas) recordemos que podemos hacer uso de los métodos is_dir o is_file. 🐤

from pathlib import Path

path = Path('/home/eduardo/projects/examples/python/async') 

if path.exists():

    print('El listado de archivos es el siguiente: ')

    for dir in path.iterdir():
        if dir.is_file():
            print(dir)

Si en caso quisiéramos filtrar archivos por extensión haremos uso del método glob, pasando como argumento nuestra expresión.

path = Path('/home/eduardo/projects/examples/python/async') 

if path.exists():
    for file in path.glob('*.py'):
        print(file)

Para este ejemplo mostramos en consola todos aquellos archivos que se encuentren dentro del directorio con extensión .py.

obtendríamos el mismo resultado si iteramos utilizando la función glob.

path = Path('/home/eduardo/projects/examples/python/async') 

for file in path.glob('*.py'):
    print(file)

Para este nuevo ejemplo solo mostraremos los archivos con extensión .py del directorio en cuestión. Si el directorio a sus vez poseyera sub folders donde a su vez se encuentren archivos .py esto no serían mostrados en consola.

Si lo que deseamos es una búsqueda recursiva les recomiendo hacer uso del método rglob. 🤠

for file in path.rglob('*.py'):
    print(file)

Conclusión

En conclusión, el módulo pathlib será sin duda uno de nuestros mejores aliados cuando nos encontremos trabajando con proyectos que involucren la manipulación de archivos o folder dentro de nuestro sistema.

No solo por la gran cantidad de métodos y atributos que el módulo nos ofrece, si no por la facilidad en estos. Pudiendo decir, sin temor a equivocarme, que el módulo pathlib eventualmente sustituirá al cien por ciento uso del módulo os en cuanto a manejo de directorios se refiere.

Es por ello que te invito, en la medida de lo posible, realices un refactors a todos tus proyectos reemplazando os por pathlib. 🍻


¿El contenido te resulto de ayuda?

Para poder dejar tu opinión es necesario ser un usuario autenticado. Login

Más Tips y Ejercicios 🐍

Adquiere una subscripción PyWombat por tan solo $3 USD. al mes.

Conoce los beneficios de ser usuario premium:
Niveles desbloqueados: Ten accesos a todos los niveles de ejercicios. 🔓
Nuevo límite: Incrementa tu límite de ejercicios por semana. 🚀
Contenido único: Recibe semanalmente recursos exclusivos de Python (Videos, Artículos y Capitulos del libro PyWombat, comienza como desarrollador Python. 🐍