Ok ... No sé dónde x
está el módulo , pero sé que necesito obtener la ruta al directorio dos niveles más arriba.
Entonces, ¿hay una forma 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!
pathlib
solución es un poco más agradable y legible, pero no se incluye con Python 2.7. Yo diría que se quede con lo que tiene, tal vez agregue un comentario.pip install pathlib2
opción para mantener la cordura en 2.7.Respuestas:
Puede utilizar
pathlib
. Desafortunadamente, esto solo está disponible en stdlib para Python 3.4. Si tiene una versión anterior, tendrá que instalar una copia de PyPI aquí . Esto debería ser fácil de usarpip
.from pathlib import Path p = Path(__file__).parents[1] print(p) # /absolute/path/to/two/levels/up
Esto usa la
parents
secuencia que proporciona acceso a los directorios principales y elige el segundo.Tenga
p
en cuenta que en este caso habrá alguna forma dePath
objeto, con sus propios métodos. Si necesita las rutas como una cadena, puede llamarlasstr
.fuente
Path
claseparents
depende de la ubicación de ejecución. Si ejecuta su__file__
desde su directorio actual, laPath
clase no tendrá padres. Se debe aceptar la respuesta de @ Sebi2020 o se debe utilizar su método original. Creo que tu método original es más legible.p = Path(os.path.abspath(__file__)).parents[1]
os.path.abspath
, también puede usarPath(__file__).resolve().parents[1]
p = Path(__file__).resolve().parents[1]
. También lo agregué como respuesta.Muy fácil:
Esto es lo que quieres:
import os.path as path two_up = path.abspath(path.join(__file__ ,"../.."))
fuente
os.pardir
lugar de..
.__file__
.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 aliasing y / o las importaciones.
Habiéndolo escrito, creo que este código es más legible (es decir, menos tiempo para comprender 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.
fuente
La mejor solución (para python> = 3.4) cuando se ejecuta desde cualquier directorio es:
from pathlib import Path two_up = Path(__file__).resolve().parents[1]
fuente
Para subir los niveles del directorio 2:
import os.path as path two_up = path.abspath(path.join(os.getcwd(),"../.."))
fuente
Personalmente, creo que usar el módulo del sistema operativo es el método más fácil, como se describe a continuación. Si sólo va a subir un nivel, reemplace ('../ ..') por ('..').
import os os.chdir('../..') --Check: os.getcwd()
fuente
He descubierto que lo siguiente funciona bien en 2.7.x
import os two_up = os.path.normpath(os.path.join(__file__,'../'))
fuente
Puede usar esto como una solución genérica:
import os def getParentDir(path, level=1): return os.path.normpath( os.path.join(path, *([".."] * level)) )
fuente
Más implementación multiplataforma será:
import pathlib two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
El uso
parent
no es compatible con Windows. También es necesario agregar.resolve()
a:fuente
parent
no trabajar en Windows? Esto parece haberse solucionado en algún momento desde que escribiste este comentario. Funciona bien para mí usando Python 3.7.2 en Windows 10.parent
trabajar en Windows 10 con Python 3.6.5. ¿De qué versión de Python estás hablando @Zhukovgeen?Suponiendo que desea acceder a la carpeta llamada xzy, dos carpetas en su archivo de Python. Esto funciona para mí e independientemente de la plataforma.
".././xyz"
fuente
(pathlib.Path ('../../')) .resolve ()
fuente
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 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í empiezo
~/Documents/notes
solo para mostrar que el directorio actual no influye en el resultado. Puse el archivograndpa.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 usar una solución general que una solución menos buena en menos líneas.
fuente
para py 3.4 y versiones posteriores, pathlib
ejemplo:
from pathlib import Path path = Path("../../data/foo/someting.csv").resolve()
fuente