Una solución alternativa de @kender
import os
os.path.dirname(os.path.normpath(yourpath))
¿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:
import os
os.path.normpath(os.path.join(yourpath, os.pardir))
Aquí las salidas para cada caso que puede encontrar (la ruta de entrada es relativa):
os.path.dirname(os.path.normpath('a/b/')) => 'a'
os.path.normpath(os.path.join('a/b/', os.pardir)) => 'a'
os.path.dirname(os.path.normpath('a/b')) => 'a'
os.path.normpath(os.path.join('a/b', os.pardir)) => 'a'
os.path.dirname(os.path.normpath('a/')) => ''
os.path.normpath(os.path.join('a/', os.pardir)) => '.'
os.path.dirname(os.path.normpath('a')) => ''
os.path.normpath(os.path.join('a', os.pardir)) => '.'
os.path.dirname(os.path.normpath('.')) => ''
os.path.normpath(os.path.join('.', os.pardir)) => '..'
os.path.dirname(os.path.normpath('')) => ''
os.path.normpath(os.path.join('', os.pardir)) => '..'
os.path.dirname(os.path.normpath('..')) => ''
os.path.normpath(os.path.join('..', os.pardir)) => '../..'
La ruta de entrada es absoluta (ruta de Linux):
os.path.dirname(os.path.normpath('/a/b')) => '/a'
os.path.normpath(os.path.join('/a/b', os.pardir)) => '/a'
os.path.dirname(os.path.normpath('/a')) => '/'
os.path.normpath(os.path.join('/a', os.pardir)) => '/'
os.path.dirname(os.path.normpath('/')) => '/'
os.path.normpath(os.path.join('/', os.pardir)) => '/'
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.