Introducci贸n al m贸dulo Python Pathlib

    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 鈥嬧媗贸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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *