Introducción al módulo Python Pathlib

I

El módulo Pathlib en Python simplifica la forma de trabajar con archivos y carpetas. El módulo Pathlib está disponible en Python 3.4 y versiones superiores. Combina lo mejor de los módulos del sistema de archivos de Python, a saber os, os.path, globetc.

En Python, la mayoría de los scripts implican interactuar con sistemas de archivos. Por lo tanto, es importante ocuparse de los nombres de archivo y las rutas. Para lograr esto, Python incluye el módulo Pathlib que contiene funciones útiles para realizar tareas relacionadas con archivos. Pathlib proporciona una forma más legible y fácil de construir rutas al representar las rutas del sistema de archivos como objetos adecuados y nos permite escribir código que es portátil entre plataformas.

En este artículo, estudiaremos el módulo Pathlib en detalle con la ayuda de varios ejemplos.

El concepto de ruta y directorio

Antes de avanzar más en los detalles del módulo Pathlib, es importante comprender 2 conceptos diferentes, a saber: ruta y directorio.

La ruta se usa para identificar un archivo. La ruta proporciona una secuencia opcional de nombres de directorio terminados por el nombre de archivo final, incluida la extensión del nombre de archivo. La extensión del nombre de archivo proporciona información sobre el formato / contenido del archivo. El módulo Pathlib puede manejar tanto rutas absolutas como relativas. Una ruta absoluta comienza desde el directorio raíz y especifica el árbol de directorios completo, mientras que una ruta relativa, como sugiere el nombre, es la ruta de un archivo relativa a otro archivo o directorio (generalmente el directorio actual).

El directorio representa la entrada del sistema de archivos de la ruta e incluye el nombre del archivo, la hora de creación, el tamaño, el propietario, etc.

El módulo Pathlib en Python se ocupa de las tareas relacionadas con la ruta, como la construcción de nuevas rutas a partir de nombres de archivos y otras rutas, la comprobación de varias propiedades de las rutas y la creación de archivos y carpetas en rutas específicas.

¿Cómo utilizar el módulo Pathlib?

Para usar el módulo pathlib convenientemente dentro de nuestros scripts, importamos todas las clases en él usando:

from pathlib import *

Como primera tarea, recuperemos el directorio de trabajo actual y los objetos del directorio de inicio, respectivamente, usando el siguiente código:

current_dir = Path.cwd()
home_dir = Path.home()
print(current_dir)
print(home_dir)

Podemos elegir import pathlib en lugar de importar todas las clases. En ese caso, todos los usos posteriores de las clases dentro del módulo deben tener el prefijo pathlib.

import pathlib

current_dir = pathlib.Path.cwd()
home_dir = pathlib.Path.home()
print(current_dir)
print(home_dir)

¿Por qué utilizar el módulo Pathlib?

Si ha estado trabajando con el lenguaje Python durante un tiempo, se preguntará cuál es la necesidad del módulo Pathlib cuando os, os.path, glob, etc. ¿Los módulos ya están disponibles? Ésta es una preocupación plenamente justificada. Intentemos abordar esto con un ejemplo.

Digamos que queremos crear un archivo llamado “output / output.xlsx” dentro del directorio de trabajo actual. El siguiente código intenta lograr esto usando el os.path módulo. Para esto, os.getcwd y os.path.join se utilizan funciones.

import os
outpath = os.path.join(os.getcwd(), 'output')
outpath_file = os.path.join(outpath, 'out.xlsx')

Alternativamente,

outpath_file = os.pathjoin(os.path.join(os.getcwd(), 'output'), "out.xlsx")

Aunque el código funciona, parece torpe y no es legible ni fácil de mantener. Imagínese cómo se vería este código si quisiéramos crear un nuevo archivo dentro de varios directorios anidados.

El mismo código se puede reescribir usando el módulo Pathlib, de la siguiente manera:

from pathlib import Path
outpath = Path.cwd() / 'output"https://Pharos.sh.com/"output.xlsx'

Este formato es más fácil de analizar mentalmente. En Pathlib, el Path.cwd() La función se usa para obtener el directorio de trabajo actual y / operador se utiliza en lugar de os.path.join para combinar partes de la ruta en un objeto de ruta compuesta. El patrón de anidación de funciones en el os.path módulo es reemplazado por el Path clase de módulo Pathlib que representa la ruta encadenando métodos y atributos. La inteligente sobrecarga del / El operador hace que el código sea legible y fácil de mantener.

Otro beneficio del método proporcionado por el módulo Pathlib es que un Path El objeto se crea en lugar de crear una representación de cadena de la ruta. Este objeto tiene varios métodos útiles que hacen la vida más fácil que trabajar con cadenas sin procesar que representan rutas.

Realización de operaciones en caminos

El clásico os.path El módulo se utiliza solo para manipular cadenas de ruta. Para hacer algo con la ruta, por ejemplo, crear un directorio, necesitamos el os módulo. los os El módulo proporciona un conjunto de funciones para trabajar con archivos y directorios, como: mkdir para crear un directorio, rename para cambiar el nombre de un directorio, getsize para obtener el tamaño de un directorio y así sucesivamente.

Escribamos algunas de estas operaciones usando el os módulo y luego reescriba el mismo código usando el módulo Pathlib.

Código de muestra escrito usando os módulo:

if os.path.isdir(path):
    os.rmdir(path)

Si usamos el módulo Pathlib path objetos para lograr la misma funcionalidad, el código resultante será mucho más legible y más fácil de mantener como se muestra a continuación:

if path.is_dir()
    path.rmdir()

Es engorroso encontrar utilidades relacionadas con la ruta en el os módulo. El módulo Pathlib resuelve el problema reemplazando las utilidades de os módulo con métodos en objetos de ruta. Entendamos esto aún mejor con un código:

outpath = os.path.join(os.getcwd(), 'output')
outpath_tmp = os.path.join(os.getcwd(), 'output.tmp')
generate_data(output_tmp)

if os.path.getsize(output_tmp):
    os.rename(outpath_tmp, outpath)
else: # Nothing produced
    os.remove(outpath_tmp)

Aquí, la función generate_data() toma una ruta de archivo como parámetro y escribe datos en otra ruta. Sin embargo, si el archivo que se pasa como parámetro no se cambia, desde la última vez que generate_data() se ejecutó la función, se genera un archivo vacío. En ese caso, el archivo vacío se reemplaza con la versión anterior del archivo.

La variable outpath almacena los datos uniendo el directorio de trabajo actual con el nombre de archivo “salida”. También creamos una versión temporal, llamada outpath.tmp. Si el tamaño de la versión temporal no es cero, lo que implica que no es un archivo vacío, se cambia el nombre de la versión temporal a outpath, de lo contrario, se elimina la versión temporal y se conserva la versión anterior.

Utilizando la os módulo, manipulando las rutas de los sistemas de archivos a medida que los objetos de cadena se vuelven torpes ya que os.path.join(), os.getcwd(), etc. Para evitar este problema, el módulo Pathlib ofrece un conjunto de clases que se pueden usar para operaciones de uso frecuente en la ruta, de una manera más legible, simple y orientada a objetos.

Intentemos reescribir el código anterior usando el módulo Pathlib.

from pathlib import Path

outpath = Path.cwd() / 'output'
outpath_tmp = Path.cwd() / 'output_tmp'

generate_data(output_tmp)

if outpath_tmp.stat().st_size:
    outpath_tmp.rename(outpath)
else: # Nothing produced
    Path_tmp.unlink()

Con Pathlib, os.getcwd () se convierte en Path.cwd () y el operador “https://Pharos.sh.com/” se usa para unir rutas y se usa en lugar de os.path.join. Usando el módulo Pathlib, las cosas se pueden hacer de una manera más simple usando operadores y llamadas a métodos.

Los siguientes son métodos de uso común y su uso:

  • Path.cwd(): Objeto de ruta de retorno que representa el directorio de trabajo actual
  • Path.home(): Objeto de ruta de retorno que representa el directorio de inicio
  • Path.stat(): devuelve información sobre la ruta
  • Path.chmod(): cambiar el modo de archivo y los permisos
  • Path.glob(pattern): Glob el patrón dado en el directorio que está representado por la ruta, produciendo archivos coincidentes de cualquier tipo
  • Path.mkdir(): para crear un nuevo directorio en la ruta dada
  • Path.open(): Para abrir el archivo creado por la ruta
  • Path.rename(): Cambia el nombre de un archivo o directorio al destino dado
  • Path.rmdir(): Eliminar el directorio vacío
  • Path.unlink(): Elimina el archivo o enlace simbólico

Generación de rutas multiplataforma

Las rutas utilizan diferentes convenciones en diferentes sistemas operativos. Windows usa una barra invertida entre los nombres de las carpetas, mientras que todos los demás sistemas operativos populares usan una barra inclinada entre los nombres de las carpetas. Si desea que su código Python funcione, independientemente del sistema operativo subyacente, deberá manejar las diferentes convenciones específicas de la plataforma subyacente. El módulo Pathlib facilita el trabajo con rutas de archivo. En Pathlib, puede simplemente pasar una ruta o un nombre de archivo a Path() objeto mediante barra diagonal, independientemente del sistema operativo. Pathlib se encarga del resto.

pathlib.Path.home() / 'python"https://Pharos.sh.com/"samples"https://Pharos.sh.com/"test_me.py'

los Path() objeto encubrirá el / al tipo de barra inclinada apto, para el sistema operativo subyacente. los pathlib.Path puede representar la ruta de Windows o Posix. Por lo tanto, Pathlib resuelve una gran cantidad de errores de funciones cruzadas, manejando rutas fácilmente.

Obtener información de ruta

Mientras tratamos con rutas, nos interesa encontrar el directorio principal de un archivo / carpeta o seguir enlaces simbólicos. La clase de ruta tiene varios métodos para hacer esto, ya que diferentes partes de una ruta están disponibles como propiedades que incluyen lo siguiente:

  • drive: una cadena que representa el nombre de la unidad. Por ejemplo, PureWindowsPath('c:/Program Files/CSV').drive devuelve “C:”
  • parts: devuelve una tupla que proporciona acceso a los componentes de la ruta
  • name: el componente de ruta sin ningún directorio
  • parent: secuencia que proporciona acceso a los antepasados ​​lógicos de la ruta
  • stem: componente de ruta final sin su sufijo
  • suffix: la extensión de archivo del componente final
  • anchor: la parte de una ruta antes del directorio. / se utiliza para crear trayectorias secundarias e imita el comportamiento de os.path.join.
  • joinpath: combina la ruta con los argumentos proporcionados
  • match(pattern): devuelve Verdadero / Falso, basado en hacer coincidir la ruta con el patrón de estilo glob proporcionado

En la ruta “/home/projects/Pharos.sh/python/sample.md”:

  • path: – devuelve PosixPath (‘/ inicio / proyectos / Pharos.sh / python / sample.md’)
  • path.parts: – devuelve (“https://Pharos.sh.com/”, ‘inicio’, ‘proyectos’, ‘Pharos.sh’, ‘python’)
  • path.name: – devuelve ‘sample.md’
  • path.stem: – devuelve ‘muestra’
  • path.suffix: – devuelve ‘.md’
  • path.parent: – devuelve PosixPath (‘/ inicio / proyectos / Pharos.sh / python’)
  • path.parent.parent: – devuelve PosixPath (‘/ inicio / proyectos / Pharos.sh’)
  • path.match('*.md'): devuelve True
  • PurePosixPath('/python').joinpath('edited_version'): devuelve (‘inicio / proyectos / Pharos.sh / python / edited_version

Alternativa del módulo Glob

Aparte de os , os.path módulos, glob El módulo también está disponible en Python y proporciona utilidades relacionadas con la ruta del archivo. glob.glob función de la glob El módulo se utiliza para buscar archivos que coincidan con un patrón.

from glob import glob

top_xlsx_files = glob('*.xlsx')
all_xlsx_files = glob('**/*.xlsx', recursive=True)

El pathlib también proporciona utilidades globales:

from pathlib import Path

top_xlsx_files = Path.cwd().glob('*.xlsx')
all_xlsx_files = Path.cwd().rglob('*.xlsx')

La funcionalidad glob está disponible con Path objetos. Por lo tanto, los módulos pathlib simplifican las tareas complejas.

Lectura y escritura de archivos usando Pathlib

Los siguientes métodos se utilizan para realizar operaciones básicas como leer y escribir archivos:

  • read_text: El archivo se abre en modo texto para leer el contenido del archivo y cerrarlo después de leerlo.
  • read_bytes: Se utiliza para abrir el archivo en modo binario y devolver el contenido en forma binaria y cierra el archivo después del mismo.
  • write_text: Se usa para abrir el archivo y escribe texto y lo cierra más tarde
  • write_bytes: Se utiliza para escribir datos binarios en un archivo y cierra el archivo, una vez hecho esto

Exploremos el uso del módulo Pathlib para operaciones comunes de archivos. El siguiente ejemplo se utiliza para leer el contenido de un archivo:

path = pathlib.Path.cwd() / 'Pathlib.md'
path.read_text()

Aquí, read_text método en Path El objeto se utiliza para leer el contenido del archivo.
El siguiente ejemplo se utiliza para escribir datos en un archivo, en modo texto:

from pathlib import Path

p = Path('sample_text_file') p.write_text('Sample to write data to a file')

Por lo tanto, en el módulo Pathlib, al tener la ruta como un objeto nos permite realizar acciones útiles en los objetos para el sistema de archivos que implican una gran cantidad de manipulación de rutas como crear o eliminar directorios, buscar archivos específicos, mover archivos, etc.

Conclusión

Para concluir, el módulo Pathlib proporciona una gran cantidad de características útiles y enriquecidas que se pueden utilizar para realizar una variedad de operaciones relacionadas con la ruta. Como ventaja adicional, la biblioteca es coherente en todo el sistema operativo subyacente.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad