M贸dulo Pathlib Python

Fecha de publicaci贸n: 15 Junio 2021
Tiempo de lectura: 3 min.
Premium: False
N煤mero de visitas: 318


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

De igual forma, mediante 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

En este caso listamos tanto archivos como sub folder. En caso solo quisi茅ramos listar alguno de ellos recordemos podernos 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)

Ahora, si en caso quisi茅ramos filtrar archivos por extensi贸n, podemos hacerlo. Para ello 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 /home/eduardo/projects/examples/python/async con extensi贸n .py.

Es importante mencionar que en este caso solo mostraremos los archivos .py del directorio en cuesti贸n. Si el directorio a sus vez poseyera sub folder donde a su vez se encuentren otros 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. 馃嵒

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. 馃悕