¿Podría alguien decirme cómo obtener el directorio principal de una ruta en Python de una manera multiplataforma? P.ej
C:\Program Files ---> C:\
y
C:\ ---> C:\
Si el directorio no tiene un directorio padre, devuelve el directorio en sí. La pregunta puede parecer simple, pero no pude desenterrarla a través de Google.
os.path.dirname
es la función para esto, comoa+=5-4
es más complicado quea+=1
. La pregunta solicitó solo el directorio padre, no si existe o el directorio padre verdadero suponiendo que los enlaces simbólicos se interpongan en el camino.os.pardir
, noos.path.pardir
.os.pardir
yos.path.pardir
son realmente correctos (son idénticos).os.path.dirname
da resultados diferentes dependiendo de si se incluye una barra inclinada final en la ruta Si desea resultados confiables, debe usar elos.path.join
método en la respuesta anterior.Utilizando
os.path.dirname
:Advertencia:
os.path.dirname()
da resultados diferentes dependiendo de si se incluye una barra inclinada final en la ruta. Esta puede o no ser la semántica que desea. Cf. La respuesta de @ kender usandoos.path.join(yourpath, os.pardir)
.fuente
os.path.dirname(r'C:\Program Files')
¿Qué? Python te está dando el directorio donde estaría el archivo 'Archivos de programa'. Además, ni siquiera tiene que existir, he aquí:os.path.dirname(r'c:\i\like\to\eat\pie')
salidas'c:\\i\\like\\to\\eat'
El método Pathlib (Python 3.4+)
El método tradicional
¿Qué método debo usar?
Use el método tradicional si:
Le preocupa que el código existente genere errores si fuera a usar un objeto Pathlib. (Dado que los objetos Pathlib no se pueden concatenar con cadenas).
Su versión de Python es inferior a 3.4.
Necesita una cadena y recibió una cadena. Supongamos, por ejemplo, que tiene una cadena que representa una ruta de archivo y desea obtener el directorio principal para poder colocarlo en una cadena JSON. Sería una tontería convertirlo en un objeto Pathlib y volver de nuevo para eso.
Si no se aplica ninguno de los anteriores, use Pathlib.
¿Qué es pathlib?
Si no sabe qué es Pathlib, el módulo Pathlib es un módulo excelente que hace que trabajar con archivos sea aún más fácil para usted. La mayoría, si no todos los módulos integrados de Python que funcionan con archivos aceptarán tanto objetos como cadenas de Pathlib. He destacado a continuación un par de ejemplos de la documentación de Pathlib que muestran algunas de las cosas interesantes que puedes hacer con Pathlib.
Navegando dentro de un árbol de directorios:
Consultar propiedades de ruta:
fuente
pip install pathlib2
use el backport.os.sep
!C:\Program Files
--->C:\\\
C:\
--->C:\\\
fuente
os.path.abspath(r'E:\O3M_Tests_Embedded\branches\sw_test_level_gp\test_scripts\..\..')
Resultado:E:\\O3M_Tests_Embedded\\branches
/
.Una solución alternativa de @kender
¿Dónde
yourpath
está la ruta para la que desea el padre?Pero esta solución no es perfecta, ya que no manejará el caso de
yourpath
una cadena vacía o un punto.Esta otra solución manejará mejor este caso de esquina:
Aquí las salidas para cada caso que puede encontrar (la ruta de entrada es relativa):
La ruta de entrada es absoluta (ruta de Linux):
fuente
fuente
os.path.split(os.path.abspath("this/is/a/dir/"))[0]
vuelve'/home/daniel/this/is/a'
como se esperaba. Por el momento no tengo un cuadro de Windows en ejecución para verificar allí. ¿En qué configuración ha observado el comportamiento que informa?parentdir = os.path.split(os.path.apspath(dir[:-1]))[0]
. Esto, estoy seguro, funciona porque si hay una barra al final, entonces se elimina; si no hay una barra oblicua, esto seguirá funcionando (incluso si la última parte de la ruta tiene solo un carácter largo) debido a la barra oblicua anterior. Por supuesto, esto supone que la ruta es correcta y no dice algo así/a//b/c///d////
(en Unix, esto todavía es válido), que en la mayoría de los casos son (adecuados) especialmente cuando haces algo comoos.path.abspath
o cualquier otraos.path
función.os.path.split("a/b//c/d///")
y, por ejemplo,cd //////dev////// is equivalent to
cd / dev / `ocd /dev
; Todos estos son válidos en Linux. Acabo de llegar con esto y puede ser útil, sin embargo:os.path.split(path[:tuple(ind for ind, char in enumerate(path) if char != "/" and char != "\\")[-1]])[0]
. (Esto esencialmente busca la última no barra y obtiene la subcadena de la ruta hasta ese carácter). Usépath = "/a//b///c///d////"
y luego ejecuté la declaración antes mencionada y obtuve'/a//b///c'
.Observar:
fuente
fuente
Si solo desea el nombre de la carpeta que es el elemento primario inmediato del archivo proporcionado como argumento y no la ruta absoluta a ese archivo:
os.path.split(os.path.dirname(currentDir))[1]
es decir, con un
currentDir
valor de/home/user/path/to/myfile/file.ext
El comando anterior devolverá:
myfile
fuente
Por ejemplo en Ubuntu:
Por ejemplo en Windows:
Ambos ejemplos intentaron en Python 2.7
fuente
fuente
Supongamos que tenemos una estructura de directorios como
1]
Queremos acceder a la ruta de "P" desde el directorio R y luego podemos acceder usando
2]
Queremos acceder a la ruta del directorio "Q" desde el directorio R, entonces podemos acceder usando
fuente
Simplemente agregue algo a la respuesta de Tung (debe usar
rstrip('/')
para ser más seguro si está en una caja de Unix).Pero, si no usa
rstrip('/')
, dada su entrada essaldría,
que probablemente no es lo que estás viendo, ya que quieres ambas cosas
"../data/replies/"
y"../data/replies"
comportarte de la misma manera.fuente
fuente
Puede usar esto para obtener el directorio principal de la ubicación actual de su archivo py.
fuente
OBTENGA la ruta del directorio principal y cree un nuevo directorio (nombre
new_dir
)Obtener ruta del directorio principal
Ejemplo 1
Ejemplo 2
fuente
Entonces una
..
ayudafuente
fuente
Las respuestas dadas anteriormente están perfectamente bien para subir uno o dos niveles de directorio, pero pueden ser un poco engorrosos si uno necesita atravesar el árbol de directorios en muchos niveles (por ejemplo, 5 o 10). Esto se puede hacer de manera concisa uniéndose a una lista de
N
os.pardir
s enos.path.join
. Ejemplo:fuente