python: obtener directorio dos niveles arriba

Ok … No sé dónde está el módulo x , pero sé que necesito obtener la ruta al directorio dos niveles.

Entonces, ¿hay una manera más elegante de hacer:

 import os two_up = os.path.dirname(os.path.dirname(__file__)) 

¡Las soluciones para Python 2 y 3 son bienvenidas!

Puedes usar pathlib . Desafortunadamente, esto solo está disponible en la versión estándar de Python 3.4. Si tiene una versión anterior, deberá instalar una copia de PyPI aquí . Esto debería ser fácil de hacer usando pip .

 from pathlib import Path p = Path(__file__).parents[1] print(p) # /absolute/path/to/two/levels/up 

Esto utiliza la secuencia de parents , que proporciona acceso a los directorios principales y elige la segunda.

Tenga en cuenta que p en este caso será alguna forma de objeto Path , con sus propios métodos. Si necesita las rutas como cadena, puede llamar a str en ellas.

Muy fácil:

Esto es lo que quieres:

 import os.path as path two_up = path.abspath(path.join(__file__ ,"../..")) 

Saludos Sebi

Iba a agregar esto solo para ser tonto, pero también porque muestra a los recién llegados la utilidad potencial de las funciones de alias y / o las importaciones.

Una vez escrito, creo que este código es más legible (es decir, menor tiempo para captar la intención) que las otras respuestas hasta la fecha, y la legibilidad es (generalmente) el rey.

 from os.path import dirname as up two_up = up(up(__file__)) 

Nota: solo desea hacer este tipo de cosas si su módulo es muy pequeño o cohesivo contextualmente.

Para obtener los niveles de directorio 2 arriba:

  import os.path as path two_up = path.abspath(path.join(os.getcwd(),"../..")) 

Personalmente, me parece que usar el módulo os es el método más fácil como se describe a continuación. Si solo está subiendo un nivel, reemplace (‘../ ..’) con (‘..’).

  import os os.chdir('../..') --Check: os.getcwd() 

La mejor solución (para python> = 3.4) al ejecutar desde cualquier directorio es:

 from pathlib import Path two_up = Path(__file__).resolve().parents[1] 

He encontrado que lo siguiente funciona bien en 2.7.x

 import os two_up = os.path.normpath(os.path.join(__file__,'../')) 

Puedes usar esto como una solución genérica:

 import os def getParentDir(path, level=1): return os.path.normpath( os.path.join(path, *([".."] * level)) ) 

Más implementación multiplataforma será:

 import pathlib two_up = (pathlib.Path(__file__) / ".." / "..").resolve() 

El uso de los parent no es compatible con Windows. También es necesario agregar .resolve() , a:

Haga que la ruta sea absoluta, resolviendo todos los enlaces simbólicos en el camino y también normalizándolos (por ejemplo, convertir barras diagonales en barras invertidas en Windows)

Todavía no veo una respuesta viable para 2.7, que no requiere la instalación de dependencias adicionales y también comienza desde el directorio del archivo. No es agradable como una solución de una sola línea, pero no hay nada de malo en usar las utilidades estándar.

 import os grandparent_dir = os.path.abspath( # Convert into absolute path string os.path.join( # Current file's grandparent directory os.path.join( # Current file's parent directory os.path.dirname( # Current file's directory os.path.abspath(__file__) # Current file path ), os.pardir ), os.pardir ) ) print grandparent_dir 

Y para demostrar que funciona, aquí comienzo en ~/Documents/notes solo para mostrar que el directorio actual no influye en el resultado. Puse el archivo grandpa.py con ese script en una carpeta llamada “scripts”. Se arrastra hasta el directorio de Documentos y luego al directorio de usuario en una Mac.

 (testing)AlanSE-OSX:notes AlanSE$ echo ~/Documents/scripts/grandpa.py /Users/alancoding/Documents/scripts/grandpa.py (testing)AlanSE-OSX:notes AlanSE$ python2.7 ~/Documents/scripts/grandpa.py /Users/alancoding 

Esta es la extrapolación obvia de la respuesta para el directorio principal . Es mejor utilizar una solución general que una solución menos buena en menos líneas.