Estoy tratando de mover mi código de usar os.path
a usar pathlib.Path
.
Tengo una función que devuelve la ruta completa de un determinado padres que busco de un nombre constante. Como se dijo, estoy usando actualmente os.path
y cuerdas para caminos Así que ahora esto se hace con regulares-expresiones.
Lo que quiero es, por ejemplo, para una constante parent = d
a ser capaz de obtener:
/a/b/c/d/e --> /a/b/c/d
/a/b/c/d/e/f --> /a/b/c/d
/root/a/b/c/d/e --> /root/a/b/c/d
Nota : Como muestra el ejemplo no quiero confiar en cualquier posición fija por ambos lados.
He tratado de 2 maneras, pero se siente un tanto torpe bits:
Utilice el
parts
fin de encontrar la correctaparents
elemento:>>> path = "/a/b/c/d/e/f" >>> parts = Path(path).parts >>> parent_index = len(parts) - 1 - parts.index('d') - 1 >>> Path(path).parents[parent_index] PosixPath('/a/b/c/d')
Utilice el
parts
y concatenar los relevantes:>>> path = "/root/a/b/c/d/e" >>> parts = Path(path).parts >>> Path(*parts[:parts.index('d')+1]) PosixPath('/root/a/b/c/d')
Yo diría que la segunda parece razonable, pero aún así, mi pregunta es: ¿Hay una mejor manera de lograr esto?
PD En caso de que la parte que no está presente en el camino que es suficiente para elevar una excepción o cualquier indicador (en este momento envuelvo con el código index
anterior con una try/except
).
Puede utilizar un while
bucle en lugar de seguir buscando hacia atrás de uno de los padres del nombre dado:
path = Path("/a/b/c/d/e/f")
while path.name != 'd':
path = path.parent
assert path.name, 'No parent found with the given name'
print(path)
Este salidas:
/a/b/c/d