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 5

Preguntas 1

Ordenar por:

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

o inicia sesi贸n.

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

Muy completo el curso! . Thanks

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

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")

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()