Guía completa para utilizar pathlib en Python para la manipulación del sistema de archivos
Descubre las ventajas de pathlib de Python sobre el módulo os explorando los objetos path, los componentes path y las operaciones path comunes para la interacción con el sistema de archivos.
Hasta hace poco, la manipulación del sistema de archivos en Python era notoriamente difícil. Los desarrolladores solían tener problemas con las rutas de archivo incorrectas, que eran propensas a errores porque requerían largas cadenas como entradas. Además, los desarrolladores informaron de que su código se rompía con frecuencia debido a incoherencias en los distintos sistemas operativos.
Por suerte, en la versión 3.4 de Python, los desarrolladores introdujeron el módulo pathlib en la biblioteca estándar. pathlib proporciona una solución elegante para manejar las rutas del sistema de archivos mediante un enfoque orientado a objetos que se esperaba desde hace tiempo, y además garantiza un comportamiento agnóstico respecto a la plataforma.
Este completo tutorial te enseñará las funciones del módulo pathlib para ayudarte en tus interacciones diarias con tu sistema de archivos. Utilizando pathlib, te beneficiarás de flujos de trabajo eficientes y de una fácil recuperación de datos. pathlib ha madurado significativamente a lo largo de los años, y nos hemos mantenido al día para que tú no tengas que hacerlo. Empecemos.
Módulo Python os vs. pathlib
Antes de Python 3.4, la forma más tradicional de manejar las rutas de los archivos era utilizando el módulo os. Aunque el módulo os fue muy eficaz en su día, ha empezado a mostrar su vejez.
Podemos mostrar el valor único de pathlib considerando una tarea común en la ciencia de datos: cómo encontrar todos los archivos png dentro de un directorio dado y todos sus subdirectorios.
Si utilizáramos el módulo os, podríamos escribir el código siguiente:
import os
dir_path ="/home/user/documents"
files =[
os.path.join(dir_path, f)for f in os.listdir(dir_path)if os.path.isfile(os.path.join(dir_path, f)) and f.endswith(".png")]Con la tecnología de
Aunque este código resuelve la tarea inmediata de encontrar nuestros archivos png, revela varias desventajas importantes del módulo os. Para empezar, el código es largo y casi ilegible, lo que es una pena, teniendo en cuenta que se trata de una operación relativamente sencilla. Como segundo punto, nuestro código presupone el conocimiento de las comprensiones de listas, lo que no debe darse por supuesto. Como tercer punto, el código implica operaciones con cadenas, que son propensas a errores. Y además de todo esto, el código no es muy conciso.
Si, en cambio, utilizáramos el módulo pathlib, nuestro código sería mucho más sencillo. Como hemos mencionado, pathlib proporciona un enfoque orientado a objetos para manejar las rutas del sistema de archivos. Echa un vistazo:
from pathlib import Path
# Create a path object
dir_path = Path(dir_path)# Find all text files inside a directory
files =list(dir_path.glob("*.png"))Con la tecnología de
Esta programación orientada a objetos organiza el código en torno a los objetos y sus interacciones, lo que conduce a un código más modular, reutilizable y mantenible. Si no estás familiarizado con la programación orientada a objetos, merece la pena que aprendas con nuestrocursoProgramación Python Orientada a Objetos.
Trabajar con objetos Path en Python
La biblioteca pathlib gira en torno a lo que se denominan objetos Path, que representan las rutas del sistema de archivos de forma estructurada e independiente de la plataforma.
Anteriormente en este tutorial, trajimos la clase Path del módulo pathlib a nuestro espacio de nombres actual utilizando la siguiente línea de código:
Después de llamar a la clase Path desde pathlib, podemos crear objetos Path de varias formas, incluyendo desde cadenas, desde otros objetos Path, desde el directorio de trabajo actual y desde el directorio de inicio.
Echemos un vistazo a cada uno de ellos.
Crear objetos ruta a partir de cadenas
Podemos crear un objeto Path pasando una cadena que represente una ruta del sistema de archivos a una variable. Convierte la representación de cadena de la ruta del archivo en un objeto Path.
file_path_str ="data/union_data.csv"
data_path = Path(file_path_str)Con la tecnología de
Crear objetos trayectoria a partir de otros objetos trayectoria
Los objetos existentes en Path pueden servir como bloques de construcción para crear nuevas rutas.
Lo hacemos combinando una ruta base, un directorio de datos y un nombre de archivo en una única ruta de archivo. Tenemos que acordarnos de utilizar una barra oblicua cuando proceda para ampliar nuestros objetos Path.
base_path = Path("/home/user")
data_dir = Path("data")# Combining multiple paths
file_path = base_path / data_dir /"prices.csv"print(file_path)Con la tecnología de
Crear objetos de ruta desde el directorio de trabajo actual
Aquí asignamos el directorio de trabajo actual a la variable cwd utilizando el método Path.cwd(). A continuación, podemos recuperar la ruta del directorio de trabajo actual donde se está ejecutando nuestro script.
Crear objetos de ruta desde el directorio de trabajo inicial
Podemos construir una ruta combinando nuestro directorio personal con subdirectorios adicionales. Aquí estamos combinando nuestro directorio personal con los subdirectorios "descargas" y "proyectos".
Una nota importante: La clase Path en sí no realiza ninguna operación del sistema de archivos, como validación de rutas, creación de directorios o archivos. Está diseñado para representar y manipular trayectorias. Para interactuar realmente con el sistema de archivos (comprobar la existencia, leer/escribir archivos), tendremos que utilizar métodos especiales de los objetos Path y, para algunos casos avanzados, obtener ayuda del módulo os.
Trabajar con componentes de ruta en Python
Los atributos de una ruta de archivo son varias propiedades y componentes de una ruta de archivo que ayudan a identificar y gestionar archivos y directorios dentro de un sistema de archivos. Al igual que una dirección física tiene diferentes partes, como el número de la calle, la ciudad, el país y el código postal, una ruta de un sistema de archivos puede descomponerse en componentes más pequeños. pathlib nos permite acceder a estos componentes y manipularlos utilizando atributos de ruta mediante la notación de puntos.
Trabajar con el directorio raíz
La raíz es el directorio superior de un sistema de archivos. En los sistemas tipo Unix, se representa con una barra oblicua (/). En Windows, suele ser una letra de unidad seguida de dos puntos, como C:.
image_file = home /"downloads"/"midjourney.png"
image_file.rootCon la tecnología de
Nota: En un Mac, las rutas de los archivos distinguen entre mayúsculas y minúsculas, por lo que /Users/username/Documents y /users/username/documents serían diferentes.
El atributo pathlib partes
Podemos utilizar el atributo .parts para dividir un objeto Path en sus componentes.
[PosixPath('/home/bexgboost/downloads'),
PosixPath('/home/bexgboost'),
PosixPath('/home'),
PosixPath('/')]Con la tecnología de
Operaciones comunes con pathlib
Path tienen muchos métodos que te permiten interactuar eficazmente con los directorios y su contenido. Veamos cómo realizar algunas de las operaciones más habituales.
Listado de directorios
El método iterdir() te permite iterar sobre todos los archivos y subdirectorios de una carpeta. Es especialmente útil para procesar todos los archivos de un directorio o realizar operaciones en cada entrada.
Como los objetos Path sólo representan rutas, a veces necesitas comprobar si existe una ruta utilizando el método .exists():
El método .exists() comprueba si existe una ruta. Esto es útil porque los objetos Path pueden representar archivos y directorios que pueden o no estar realmente presentes en el sistema de archivos.
pathlib también ofrece funciones para crear y borrar archivos y directorios. Veamos cómo.
El método mkdir()
El método mkdir() crea un nuevo directorio en la ruta especificada. Por defecto, crea el directorio en el directorio de trabajo actual.
from pathlib import Path
data_dir = Path("new_data_dir")# Create the directory 'new_data_dir' in the current working directory
data_dir.mkdir()Con la tecnología de
El método mkdir(padres=Verdadero)
El método mkdir(parents=True) es especialmente útil cuando quieres crear una estructura de directorios en la que algunos directorios padre pueden no existir. Establecer parents=True garantiza que se creen todos los directorios padre necesarios a lo largo del proceso.
sub_dir = Path("data/nested/subdirectory")# Create 'data/nested/subdirectory', even if 'data' or 'nested' don't exist
sub_dir.mkdir(parents=True)Con la tecnología de
Ten en cuenta que mkdir() lanza una excepción si ya existe un directorio con el mismo nombre.
El método unlink() borra permanentemente un archivo representado por el objeto Path. Se recomienda comprobar si existe un archivo antes de ejecutar este método para evitar recibir un error.
to_delete = Path("data/prices.csv")if to_delete.exists():
to_delete.unlink()print(f"Successfully deleted {to_delete.name}")Con la tecnología de
El método rmdir() elimina un directorio vacío. Recuerda que rmdir() sólo funciona para eliminar directorios vacíos. La forma más sencilla de borrar un directorio no vacío es utilizar la biblioteca shutil o el terminal.
Nota: Ten cuidado al utilizar unlink() o rmdir() porque sus resultados son permanentes.
Manipulación avanzada de trayectorias
Pasemos a algunos conceptos avanzados de manipulación de trayectorias y cómo aplicarlos en la práctica utilizando pathlib.
Rutas relativas vs. absolutas
Empezaremos por comprender las diferencias entre rutas absolutas y relativas, ya que surgen a menudo.
Caminos relativos
Las rutas relativas especifican la ubicación de un archivo o directorio respecto al directorio actual, de ahí la palabra relativa. Son breves y flexibles dentro de tu proyecto, pero pueden ser confusos si cambias el directorio de trabajo.
Por ejemplo, tengo una carpeta images en mi directorio de trabajo actual, que tiene el archivo midjourney.png.
El código anterior funciona ahora, pero si muevo el bloc de notas que estoy utilizando a una ubicación diferente, el fragmento se romperá porque la carpeta de imágenes no se movió con el bloc de notas.
Rutas absolutas
Las rutas absolutas especifican la ubicación completa de un archivo o directorio desde la raíz del sistema de archivos. Son independientes del directorio actual y ofrecen un punto de referencia claro para cualquier usuario en cualquier parte del sistema.
image_absolute = Path("/home/bexgboost/articles/2024/4_april/8_pathlib/images/midjourney.png")
image_absoluteCon la tecnología de
PosixPath('/home/bexgboost/articles/2024/4_april/8_pathlib/images/midjourney.png')Con la tecnología de
Como puedes ver, las rutas absolutas pueden ser bastante largas, especialmente en proyectos complejos con estructuras de árbol anidadas. Por eso, la mayoría de la gente prefiere las rutas relativas, que son más cortas.
Método Resolver
pathlib proporciona métodos para convertir rutas relativas en absolutas con el método resolve().
relative_image = Path("images/midjourney.png")
absolute_image = relative_image.resolve()
absolute_imageCon la tecnología de
PosixPath('/home/bexgboost/articles/2024/4_april/8_pathlib/images/midjourney.png')Con la tecnología de
También podemos ir en sentido contrario: Si tenemos una ruta absoluta, podemos convertirla en relativa a partir de un directorio de referencia.
relative_path = Path.cwd()
absolute_image.relative_to(relative_path)Con la tecnología de
Para ilustrar el globbing, podemos volver al ejemplo que presentamos al principio del artículo, en el que escribimos código para encontrar todos los archivos png en un directorio determinado.
pathlib utiliza el módulo incorporado .glob() para buscar eficazmente archivos que coincidan con un patrón específico en cualquier directorio. Este módulo es muy útil cuando se procesan archivos con nombres o extensiones similares.
El método glob funciona aceptando como entrada una cadena de patrones que contiene comodines y devuelve un objeto generador que produce objetos Path coincidentes bajo demanda:
*: Coincide con cero o más caracteres.
?: Coincide con cualquier carácter.
[]: Coincide con un rango de caracteres encerrados entre paréntesis (por ejemplo, [a-z] coincide con cualquier letra minúscula).
Para ilustrarlo, intentemos encontrar todos los cuadernos Jupyter en mi directorio de artículos.
articles_dir = Path.home()/"articles"# Find all scripts
notebooks = articles_dir.glob("*.ipynb")# Print how many foundprint(len(list(notebooks)))Con la tecnología de
El método .glob() no encontró ningún cuaderno, lo que a primera vista parece sorprendente porque he escrito más de 150 artículos. La razón es que .glob() sólo busca dentro del directorio dado, no en sus subdirectorios.
Podemos solucionarlo haciendo una búsqueda recursiva, para lo que necesitamos utilizar el método rglob(), que tiene una sintaxis similar:
notebooks = articles_dir.rglob("*.ipynb")print(len(list(notebooks)))Con la tecnología de
Esta vez, nuestro código encontró los 357 archivos.
Trabajar con archivos
Como hemos visto, los objetos Path sólo representan archivos, pero no realizan operaciones con ellos. Sin embargo, disponen de ciertos métodos para las operaciones habituales con archivos. Veremos cómo utilizarlos en esta sección.
Lectura de archivos
La lectura del contenido de los archivos es una operación fundamental en muchas aplicaciones de Python. pathlib proporciona cómodos métodos abreviados para leer archivos como texto o como bytes sin procesar.
El método read_text() nos permite leer el contenido de un archivo de texto y cerrarlo.
Recuerda, cuando utilices un método read_*, el tratamiento de errores es importante:
nonexistent_file = Path("gibberish.txt")try:
contents = nonexistent_file.read_text()except FileNotFoundError:print("No such thing.")Con la tecnología de
Como vemos, el método write_text() sobrescribe el texto. Aunque no hay modo de añadir texto para write_text(), podemos utilizar read_text() y write_text() juntos para añadir texto al final del archivo.
old_text =file.read_text()+"\n"
final_text ="This is the final text."# Combine old and new texts and write them backfile.write_text(old_text + final_text)print(file.read_text())Con la tecnología de
El método with_stem() devuelve una ruta de archivo con un nombre de archivo diferente (aunque el sufijo sigue siendo el mismo). Esto nos permite leer una imagen original y escribir su contexto en una nueva imagen.
rename() acepta una ruta de destino, que puede ser una cadena u otro objeto ruta.
Para mover archivos, puedes utilizar la función replace(), que también acepta una ruta de destino:
# Define the file to be moved
source_file = Path("new_file.txt")# Define the location to put the file
destination = Path("data/new/location")# Create the directories if they don't exist
destination.mkdir(parents=True)# Move the file
source_file.replace(destination / source_file.name)Con la tecnología de
El método touch está pensado originalmente para actualizar la hora de modificación de un archivo, por lo que también se puede utilizar en archivos existentes.
Cuando necesites reservar un nombre de archivo para utilizarlo más adelante, pero no tengas ningún contenido que escribir en él en ese momento, podemos utilizar el toque para crear un espacio en blanco. El método se inspiró en el comando de terminal táctil de Unix.
Permisos e información del sistema de archivos
Como punto final, aprenderemos a acceder a las características de los archivos utilizando el método .stat(). Si estás familiarizado con os, te darás cuenta de que este nuevo método tiene el mismo resultado que os.stat().
La introducción del módulo pathlib en Python 3.4 ha simplificado significativamente la manipulación del sistema de archivos para los desarrolladores. Al proporcionar un enfoque orientado a objetos para manejar las rutas de los archivos, pathlib proporciona una forma estructurada y directa de representar las rutas del sistema de archivos. pathlib también ofrece independencia de la plataforma, lo que significa que pathlib maneja los separadores de rutas de forma coherente en diferentes sistemas operativos, de modo que nuestro código no se rompe en una máquina nueva. Por último, pathlib ofrece un amplio conjunto de métodos concisos y expresivos para las operaciones habituales del sistema de archivos, como hemos visto.
Aprende a crear e importar módulos de Python. ¡Descubre las mejores prácticas, ejemplos y consejos para escribir código Python reutilizable, organizado y eficiente!
Aborda los fundamentos de la Programación Orientada a Objetos (POO) en Python: explora las clases, los objetos, los métodos de instancia, los atributos y ¡mucho más!
Explora el análisis de datos con Python. Los DataFrames de Pandas facilitan la manipulación de tus datos, desde la selección o sustitución de columnas e índices hasta la remodelación de tus datos.
Este artículo explica qué son los blocs de notas y por qué deberías utilizarlos. También profundizamos en los cuadernos alojados, que facilitan el intercambio y la colaboración. Este artículo también incluye consejos, trucos y atajos de teclado.
Mejora tus conocimientos de programación. Aprende a optimizar el código, a escribir funciones y pruebas, y a utilizar las mejores técnicas de ingeniería de software.
Hasta hace poco, la manipulación del sistema de archivos en Python era notoriamente difícil. Los desarrolladores solían tener problemas con las rutas de archivo incorrectas, que eran propensas a errores porque requerían largas cadenas como entradas. Además, los desarrolladores informaron de que su código se rompía con frecuencia debido a incoherencias en los distintos sistemas operativos.
Por suerte, en la versión 3.4 de Python, los desarrolladores introdujeron el módulo
pathliben la biblioteca estándar.pathlibproporciona una solución elegante para manejar las rutas del sistema de archivos mediante un enfoque orientado a objetos que se esperaba desde hace tiempo, y además garantiza un comportamiento agnóstico respecto a la plataforma.Este completo tutorial te enseñará las funciones del módulo
pathlibpara ayudarte en tus interacciones diarias con tu sistema de archivos. Utilizandopathlib, te beneficiarás de flujos de trabajo eficientes y de una fácil recuperación de datos.pathlibha madurado significativamente a lo largo de los años, y nos hemos mantenido al día para que tú no tengas que hacerlo. Empecemos.Módulo Python os vs. pathlib
Antes de Python 3.4, la forma más tradicional de manejar las rutas de los archivos era utilizando el módulo
os. Aunque el móduloosfue muy eficaz en su día, ha empezado a mostrar su vejez.Podemos mostrar el valor único de
pathlibconsiderando una tarea común en la ciencia de datos: cómo encontrar todos los archivospngdentro de un directorio dado y todos sus subdirectorios.Si utilizáramos el módulo
os, podríamos escribir el código siguiente:Aunque este código resuelve la tarea inmediata de encontrar nuestros archivos
png, revela varias desventajas importantes del móduloos. Para empezar, el código es largo y casi ilegible, lo que es una pena, teniendo en cuenta que se trata de una operación relativamente sencilla. Como segundo punto, nuestro código presupone el conocimiento de las comprensiones de listas, lo que no debe darse por supuesto. Como tercer punto, el código implica operaciones con cadenas, que son propensas a errores. Y además de todo esto, el código no es muy conciso.Si, en cambio, utilizáramos el módulo pathlib, nuestro código sería mucho más sencillo. Como hemos mencionado,
pathlibproporciona un enfoque orientado a objetos para manejar las rutas del sistema de archivos. Echa un vistazo:Esta programación orientada a objetos organiza el código en torno a los objetos y sus interacciones, lo que conduce a un código más modular, reutilizable y mantenible. Si no estás familiarizado con la programación orientada a objetos, merece la pena que aprendas con nuestrocurso Programación Python Orientada a Objetos.
Trabajar con objetos Path en Python
La biblioteca
pathlibgira en torno a lo que se denominan objetosPath, que representan las rutas del sistema de archivos de forma estructurada e independiente de la plataforma.Anteriormente en este tutorial, trajimos la clase
Pathdel módulopathliba nuestro espacio de nombres actual utilizando la siguiente línea de código:Después de llamar a la clase
Pathdesdepathlib, podemos crear objetosPathde varias formas, incluyendo desde cadenas, desde otros objetosPath, desde el directorio de trabajo actual y desde el directorio de inicio.Echemos un vistazo a cada uno de ellos.
Crear objetos ruta a partir de cadenas
Podemos crear un objeto
Pathpasando una cadena que represente una ruta del sistema de archivos a una variable. Convierte la representación de cadena de la ruta del archivo en un objetoPath.Crear objetos trayectoria a partir de otros objetos trayectoria
Los objetos existentes en
Pathpueden servir como bloques de construcción para crear nuevas rutas.Lo hacemos combinando una ruta base, un directorio de datos y un nombre de archivo en una única ruta de archivo. Tenemos que acordarnos de utilizar una barra oblicua cuando proceda para ampliar nuestros objetos
Path.Crear objetos de ruta desde el directorio de trabajo actual
Aquí asignamos el directorio de trabajo actual a la variable
cwdutilizando el métodoPath.cwd(). A continuación, podemos recuperar la ruta del directorio de trabajo actual donde se está ejecutando nuestro script.Crear objetos de ruta desde el directorio de trabajo inicial
Podemos construir una ruta combinando nuestro directorio personal con subdirectorios adicionales. Aquí estamos combinando nuestro directorio personal con los subdirectorios "descargas" y "proyectos".
Una nota importante: La clase
Pathen sí no realiza ninguna operación del sistema de archivos, como validación de rutas, creación de directorios o archivos. Está diseñado para representar y manipular trayectorias. Para interactuar realmente con el sistema de archivos (comprobar la existencia, leer/escribir archivos), tendremos que utilizar métodos especiales de los objetosPathy, para algunos casos avanzados, obtener ayuda del móduloos.Trabajar con componentes de ruta en Python
Los atributos de una ruta de archivo son varias propiedades y componentes de una ruta de archivo que ayudan a identificar y gestionar archivos y directorios dentro de un sistema de archivos. Al igual que una dirección física tiene diferentes partes, como el número de la calle, la ciudad, el país y el código postal, una ruta de un sistema de archivos puede descomponerse en componentes más pequeños.
pathlibnos permite acceder a estos componentes y manipularlos utilizando atributos de ruta mediante la notación de puntos.Trabajar con el directorio raíz
La raíz es el directorio superior de un sistema de archivos. En los sistemas tipo Unix, se representa con una barra oblicua (
/). En Windows, suele ser una letra de unidad seguida de dos puntos, comoC:.Trabajar con el directorio principal
El padre contiene el archivo o directorio actual. es un nivel superior relativo al directorio o archivo actual.
Trabajar con el nombre del archivo
Este atributo devuelve el nombre completo del archivo, incluida la extensión, en forma de cadena.
Trabajar con el sufijo del archivo
El atributo sufijo devuelve la extensión del archivo, incluido el punto, como una cadena (o una cadena vacía si no hay extensión).
Trabajar con la raíz del archivo
La raíz devuelve el nombre del archivo sin la extensión. Trabajar con el tallo puede ser útil al convertir archivos a distintos formatos.
Nota: En un Mac, las rutas de los archivos distinguen entre mayúsculas y minúsculas, por lo que
/Users/username/Documentsy/users/username/documentsserían diferentes.El atributo pathlib partes
Podemos utilizar el atributo
.partspara dividir un objetoPathen sus componentes.El atributo pathlib padres
El atributo
parents, que devuelve un generador, convierte estos componentes en objetosPath.Operaciones comunes con pathlib
Pathtienen muchos métodos que te permiten interactuar eficazmente con los directorios y su contenido. Veamos cómo realizar algunas de las operaciones más habituales.Listado de directorios
El método
iterdir()te permite iterar sobre todos los archivos y subdirectorios de una carpeta. Es especialmente útil para procesar todos los archivos de un directorio o realizar operaciones en cada entrada.Como
iterdir()devuelve un iterador, las entradas se recuperan bajo demanda a medida que avanzas por el bucle.El método is_dir()
El método
is_dir()devuelveTruesi la ruta apunta a un directorio,Falseen caso contrario.El método is_file()
El método
.is_file()devuelveTruesi la ruta apunta a un archivo,Falseen caso contrario.El método existe()
Como los objetos
Pathsólo representan rutas, a veces necesitas comprobar si existe una ruta utilizando el método.exists():El método .exists() comprueba si existe una ruta. Esto es útil porque los objetos
Pathpueden representar archivos y directorios que pueden o no estar realmente presentes en el sistema de archivos.Crear y eliminar rutas
pathlibtambién ofrece funciones para crear y borrar archivos y directorios. Veamos cómo.El método mkdir()
El método
mkdir()crea un nuevo directorio en la ruta especificada. Por defecto, crea el directorio en el directorio de trabajo actual.El método mkdir(padres=Verdadero)
El método
mkdir(parents=True)es especialmente útil cuando quieres crear una estructura de directorios en la que algunos directorios padre pueden no existir. Establecerparents=Truegarantiza que se creen todos los directorios padre necesarios a lo largo del proceso.Ten en cuenta que
mkdir()lanza una excepción si ya existe un directorio con el mismo nombre.El método unlink()
El método
unlink()borra permanentemente un archivo representado por el objetoPath. Se recomienda comprobar si existe un archivo antes de ejecutar este método para evitar recibir un error.El método rmdir()
El método
rmdir()elimina un directorio vacío. Recuerda quermdir()sólo funciona para eliminar directorios vacíos. La forma más sencilla de borrar un directorio no vacío es utilizar la biblioteca shutil o el terminal.Nota: Ten cuidado al utilizar
unlink()ormdir()porque sus resultados son permanentes.Manipulación avanzada de trayectorias
Pasemos a algunos conceptos avanzados de manipulación de trayectorias y cómo aplicarlos en la práctica utilizando
pathlib.Rutas relativas vs. absolutas
Empezaremos por comprender las diferencias entre rutas absolutas y relativas, ya que surgen a menudo.
Caminos relativos
Las rutas relativas especifican la ubicación de un archivo o directorio respecto al directorio actual, de ahí la palabra relativa. Son breves y flexibles dentro de tu proyecto, pero pueden ser confusos si cambias el directorio de trabajo.
Por ejemplo, tengo una carpeta images en mi directorio de trabajo actual, que tiene el archivo
midjourney.png.El código anterior funciona ahora, pero si muevo el bloc de notas que estoy utilizando a una ubicación diferente, el fragmento se romperá porque la carpeta de imágenes no se movió con el bloc de notas.
Rutas absolutas
Las rutas absolutas especifican la ubicación completa de un archivo o directorio desde la raíz del sistema de archivos. Son independientes del directorio actual y ofrecen un punto de referencia claro para cualquier usuario en cualquier parte del sistema.
Como puedes ver, las rutas absolutas pueden ser bastante largas, especialmente en proyectos complejos con estructuras de árbol anidadas. Por eso, la mayoría de la gente prefiere las rutas relativas, que son más cortas.
Método Resolver
pathlibproporciona métodos para convertir rutas relativas en absolutas con el métodoresolve().También podemos ir en sentido contrario: Si tenemos una ruta absoluta, podemos convertirla en relativa a partir de un directorio de referencia.
Globbing
Para ilustrar el globbing, podemos volver al ejemplo que presentamos al principio del artículo, en el que escribimos código para encontrar todos los archivos
pngen un directorio determinado.pathlibutiliza el módulo incorporado.glob()para buscar eficazmente archivos que coincidan con un patrón específico en cualquier directorio. Este módulo es muy útil cuando se procesan archivos con nombres o extensiones similares.El método glob funciona aceptando como entrada una cadena de patrones que contiene comodines y devuelve un objeto generador que produce objetos
Pathcoincidentes bajo demanda:*: Coincide con cero o más caracteres.?: Coincide con cualquier carácter.[]: Coincide con un rango de caracteres encerrados entre paréntesis (por ejemplo, [a-z] coincide con cualquier letra minúscula).Para ilustrarlo, intentemos encontrar todos los cuadernos Jupyter en mi directorio de artículos.
El método
.glob()no encontró ningún cuaderno, lo que a primera vista parece sorprendente porque he escrito más de 150 artículos. La razón es que.glob()sólo busca dentro del directorio dado, no en sus subdirectorios.Podemos solucionarlo haciendo una búsqueda recursiva, para lo que necesitamos utilizar el método
rglob(), que tiene una sintaxis similar:Esta vez, nuestro código encontró los 357 archivos.
Trabajar con archivos
Como hemos visto, los objetos
Pathsólo representan archivos, pero no realizan operaciones con ellos. Sin embargo, disponen de ciertos métodos para las operaciones habituales con archivos. Veremos cómo utilizarlos en esta sección.Lectura de archivos
La lectura del contenido de los archivos es una operación fundamental en muchas aplicaciones de Python.
pathlibproporciona cómodos métodos abreviados para leer archivos como texto o como bytes sin procesar.El método
read_text()nos permite leer el contenido de un archivo de texto y cerrarlo.Para los archivos binarios, podemos utilizar en su lugar el método
read_bytes().Recuerda, cuando utilices un método
read_*, el tratamiento de errores es importante:Escribir archivos
Escribir en archivos es tan fácil como leer archivos. Para escribir archivos, tenemos el método
write_text().Como vemos, el método
write_text()sobrescribe el texto. Aunque no hay modo de añadir texto parawrite_text(), podemos utilizarread_text()ywrite_text()juntos para añadir texto al final del archivo.write_bytes()funciona de forma similar. Para ilustrarlo, dupliquemos primero la imagenmidjourney.pngcon un nuevo nombre.El método
with_stem()devuelve una ruta de archivo con un nombre de archivo diferente (aunque el sufijo sigue siendo el mismo). Esto nos permite leer una imagen original y escribir su contexto en una nueva imagen.Renombrar y mover archivos
Además de la función
with_stem()para renombrar la raíz de un archivo,pathlibofrece el métodorename()para renombrar de forma más completa.rename()acepta una ruta de destino, que puede ser una cadena u otro objeto ruta.Para mover archivos, puedes utilizar la función
replace(), que también acepta una ruta de destino:Crear archivos en blanco
pathlibnos permite crear archivos en blanco utilizando el métodotouch:El método
touchestá pensado originalmente para actualizar la hora de modificación de un archivo, por lo que también se puede utilizar en archivos existentes.Cuando necesites reservar un nombre de archivo para utilizarlo más adelante, pero no tengas ningún contenido que escribir en él en ese momento, podemos utilizar el toque para crear un espacio en blanco. El método se inspiró en el comando de terminal táctil de Unix.
Permisos e información del sistema de archivos
Como punto final, aprenderemos a acceder a las características de los archivos utilizando el método
.stat(). Si estás familiarizado conos, te darás cuenta de que este nuevo método tiene el mismo resultado queos.stat().También podemos recuperar el tamaño del archivo utilizando la notación con puntos.
Conclusión
La introducción del módulo
pathliben Python 3.4 ha simplificado significativamente la manipulación del sistema de archivos para los desarrolladores. Al proporcionar un enfoque orientado a objetos para manejar las rutas de los archivos,pathlibproporciona una forma estructurada y directa de representar las rutas del sistema de archivos.pathlibtambién ofrece independencia de la plataforma, lo que significa quepathlibmaneja los separadores de rutas de forma coherente en diferentes sistemas operativos, de modo que nuestro código no se rompe en una máquina nueva. Por último,pathlibofrece un amplio conjunto de métodos concisos y expresivos para las operaciones habituales del sistema de archivos, como hemos visto.Ten en cuenta que
pathlibrepresenta una de las muchas y potentes bibliotecas incorporadas en Python. Si sigues nuestros cursos Científico de Datos con Python, Python Programming Skill Track e Introducción a Python para la Ciencia de Datos, dominarás un amplio conjunto de bibliotecas integradas para convertirte en un sólido programador de Python.¡Gracias por leer!