No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Crear referencias relativas de archivos

10/14
Recursos

Objetivo

Necesitamos encontrar una forma de evitar que nuestro proyecto se rompa cuando movamos de lugar un archivo dentro del proyecto, para esto usaremos Referencias Relativas.

Implementaci贸n

Usando PyProjRoot:

import pyprojroot

pyprojroot.here()  # Esto es un Posix Path (pathlib)
pyprojroot.here().joinpath("data", "raw") 
  • El path en pyprojroot se construye desde la ra铆z, no desde el path del archivo que lo ejecuta.
  • Puedes mover el archivo a cualquier parte de la carpeta del proyecto, pero los paths no se romper谩n.

Usando PyHere:

import pyhere

pyhere.here()  # Tambi茅n regresa un Posix Path
  • El directorio que regresa es el directorio padre del directorio actual.

Comparaci贸n

Estas dos l铆neas de c贸digo regresan el mismo resultado:

pyprojroot.here("data").joinpath("raw")
pyhere.here().resolve() / "data" / "raw"
  • Estas dos librer铆as sirven para crear shortcuts. Para esto, se puede usar la siguiente funci贸n:
def make_dir_function(dir_name):
    def dir_function(*args):
        return pyprojroot.here()joinpath(dir_name, *args)
    return dir_function


data_dir = make_dir_function("data")
data_dir("raw", "pathlib")  # Devuelve el path personalizado
  • Puedes crear la cantidad de shortcuts que tu proyecto necesite.

Contribuci贸n creada por: N茅stor Arellano.

Aportes 8

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Lo claro que tiene todo Jesus es una maravilla. Un libro abierto!

me dio curiosidad como pyhere detecta que directorio es el root as铆 que vi su c贸digo

root_indicators = [
    ".here",
    "requirements.txt",
    "setup.py",
    ".vscode", # vscode project
    ".idea", # pycharm project
    ".git",
    ".spyderproject", # spyder
    ".spyproject", # spyder
    ".ropeproject" # rope
]

b谩sicamente tiene una lista de indicadores y un scrip posterior que va de carpeta padre (鈥) en carpeta padre buscando los indicadores y al encontralos retorna su ubicaci贸n siendo ese el root

aqu铆 el link del repo

Crear referencias relativas de archivos

Las referencias relativas evitan que el proyecto se rompa cuando movemos de lugar un archivo dentro del mismo

Usando pyprojroot

  • Mostrar la ruta principal del proyecto
import pyprojroot
#ruta actual del proyecto
pyprojroot.here()
  • Ir a la carpeta raw
# Ir a raw
pyprojroot.here().joinpath("curso-entorno-avanzado-ds-manejo-rutas", "data", "raw")

Usando pyhere

  • Ruta de la carpeta actual
import pyhere
pyhere.here()
# Los n veces dos puntos indica que la raiz del proyecto esta n pasos hacia atras
  • Mostrar ruta principal del proyecto
pyhere.here().resolve()
  • Ir a la carpeta raw
# ir a raw
pyhere.here().resolve() / "curso-entorno-avanzado-ds-manejo-rutas" / "data" / "raw"

Creando shorcut

  • Funcion que permite ir a la ruta especificada
def make_dir_function(dir_name):
    
    def dir_function(*args):
        return pyprojroot.here().joinpath(dir_name, *args)

    return dir_function
  • Colocar la carpeta data como raiz principal
data_dir = make_dir_function("curso-entorno-avanzado-ds-manejo-rutas/data")
# verifica si el archivo .gitkeep existe en la ruta espeficicada
data_dir("raw", ".gitkeep").exists()
  • Colocar la carpeta notebooks como raiz principal
data_dir = make_dir_function("curso-entorno-avanzado-ds-manejo-rutas/notebooks")
# verifica si el archivo un notebooks existe en la ruta espeficicada
notebooks_dir("0.0-paths_management_platzi-introduction.ipynb").exists()

Muy completo el curso! . Thanks

Entendido y aplicado

#
import pyprojroot
pyprojroot.here().joinpath("data", "raw")
#
import pyhere
pyhere.here("data", "raw")
pyhere.here().resolve().joinpath("raw")

#
def make_dir_function(dir_name):
    def dir_function(*args):

        if isinstance(dir_name, str):
            return pyprojroot.here().joinpath(dir_name, *args)
        else:
            return pyprojroot.here().joinpath(*dir_name, *args)

    return dir_function

# Nested lambda.
make_dir_function_lambda = lambda dir_name: lambda *args: pyprojroot.here().joinpath(dir_name, *args)

#
data_dir = make_dir_function("data")
data_dir("external", "os", "do")
#figures_dir = make_dir_function_lambda("figures")
figures_dir("amazing", "plots", "here")

Rutas Absolutas vs. Rutas Relativas:

  • Una ruta absoluta comienza desde el directorio ra铆z del sistema de archivos. Por ejemplo, C:\Users\Usuario\Proyecto\carpeta1\archivo1.txt (en Windows) o /home/usuario/proyecto/carpeta1/archivo1.txt (en Linux).

  • Una ruta relativa comienza desde la ubicaci贸n actual del archivo o script que est谩s ejecutando. Por ejemplo, si est谩s ejecutando el archivo script.py en la carpeta mi_proyecto, la ruta relativa para acceder a archivo1.txt ser铆a carpeta1/archivo1.txt.

Manejo de Rutas y Referencias Relativas en Programaci贸n

Manejo de Rutas:

  • Unificaci贸n de Rutas:

    • Diferentes sistemas operativos utilizan convenciones diversas para representar rutas de archivos. Por ejemplo, \ en Windows y / en Unix/Linux. El manejo de rutas unifica estas representaciones para hacer que el c贸digo sea independiente del sistema operativo.
  • Construcci贸n de Rutas:

    • Permite la construcci贸n program谩tica de rutas, 煤til al referenciar archivos o directorios de manera din谩mica en el c贸digo.

Referencias Relativas de Archivos:

  • Portabilidad del C贸digo:

    • Utilizar referencias relativas hace que el c贸digo sea m谩s portable. Mover el proyecto a diferentes directorios o sistemas no requiere cambios en las rutas absolutas.
  • Organizaci贸n del Proyecto:

    • Facilita la organizaci贸n del proyecto al estructurar l贸gicamente archivos y directorios, mejorando la comprensi贸n y el mantenimiento del c贸digo.
  • Colaboraci贸n y Distribuci贸n:

    • Al compartir o distribuir el c贸digo, las rutas relativas permiten a otros replicar la estructura del proyecto sin preocuparse por configuraciones espec铆ficas de sus sistemas.


ChatGPT