Dada una ruta, ¿cómo puedo extraer solo el nombre de la carpeta que lo contiene?

4 minutos de lectura

Avatar de usuario de Vasily
Vasili

En Python, ¿qué comando debo usar para obtener el nombre de la carpeta que contiene el archivo con el que estoy trabajando?

"C:\folder1\folder2\filename.xml"

Aquí "folder2" es lo que quiero conseguir.

Lo único que se me ocurrió es usar os.path.split dos veces:

folderName = os.path.split(os.path.split("C:\folder1\folder2\filename.xml")[0])[1]

¿Hay alguna manera mejor de hacerlo?

  • posible duplicado: Python – Extraiga la ruta de la carpeta de la ruta del archivo

    – jfs

    27/10/2015 a las 15:40

avatar de usuario de fedorqui
fedorqui

Puedes usar dirname:

os.path.dirname(path)

Devuelve el nombre del directorio de la ruta del nombre de la ruta. Este es el primer elemento del par devuelto al pasar la ruta a la función split().

Y dada la ruta completa, puede dividirse normalmente para obtener la última parte de la ruta. Por ejemplo, usando basename:

os.path.basename(path)

Devuelve el nombre base de la ruta del nombre de la ruta. Este es el segundo elemento del par devuelto al pasar la ruta a la función split(). Tenga en cuenta que el resultado de esta función es diferente del programa de nombre base de Unix; donde basename para ‘/foo/bar/’ devuelve ‘bar’, la función basename() devuelve una cadena vacía (”).


Todos juntos:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'

avatar de usuario de idjaw
idjaw

Estás buscando usar dirname. Si solo quiere ese directorio, puede usar os.ruta.nombrebase,

Cuando se ponen todos juntos se ve así:

os.path.basename(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))

Eso debería obtener “other_sub_dir”

El siguiente no es el enfoque ideal, pero originalmente propuse usar os.path.split y simplemente obtener el último elemento. que se vería así:

os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1]

esto es bastante antiguo, pero si está usando Python 3.4 o superior, use PathLib.

# using OS
import os
path=os.path.dirname("C:/folder1/folder2/filename.xml")
print(path)
print(os.path.basename(path))

# using pathlib
import pathlib
path = pathlib.PurePath("C:/folder1/folder2/filename.xml")
print(path.parent)
print(path.parent.name)

os.path.dirname es lo que buscas –

os.path.dirname(r"C:\folder1\folder2\filename.xml")

Asegúrate de anteponer r a la cadena para que se considere como una cadena sin procesar.

demostración –

In [46]: os.path.dirname(r"C:\folder1\folder2\filename.xml")
Out[46]: 'C:\\folder1\\folder2'

si solo quieres folder2 puedes usar os.path.basename con lo anterior, Ejemplo –

os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))

demostración –

In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
Out[48]: 'folder2'

puedes usar rutalib

from pathlib import Path
Path(r"C:\folder1\folder2\filename.xml").parts[-2]

El resultado de lo anterior fue este:

'folder2'

  • Path(r”C:\folder1\folder2\filename.xml”).parent debería hacer el trabajo

    – me iré

    9 de mayo de 2022 a las 16:42

avatar de usuario de tjd sydney
tjd sydney

Puede obtener la ruta completa como una cadena y luego dividirla en una lista usando el carácter separador de su sistema operativo. Luego obtiene el nombre del programa, el nombre de la carpeta, etc. accediendo a los elementos desde el final de la lista usando índices negativos.

Como esto:

import os
strPath = os.path.realpath(__file__)
print( f"Full Path    :{strPath}" )
nmFolders = strPath.split( os.path.sep )
print( "List of Folders:", nmFolders )
print( f"Program Name :{nmFolders[-1]}" )
print( f"Folder Name  :{nmFolders[-2]}" )
print( f"Folder Parent:{nmFolders[-3]}" )

El resultado de lo anterior fue este:

Full Path    :C:\Users\terry\Documents\apps\environments\dev\app_02\app_02.py
List of Folders: ['C:', 'Users', 'terry', 'Documents', 'apps', 'environments', 'dev', 'app_02', 'app_02.py']
Program Name :app_02.py
Folder Name  :app_02
Folder Parent:dev

  • Path(r”C:\folder1\folder2\filename.xml”).parent debería hacer el trabajo

    – me iré

    9 de mayo de 2022 a las 16:42

Avatar de usuario de TAbdiukov
tabdiukov

Hice una mejora en las soluciones disponibles, a saber, el fragmento que funciona con todos,

  1. Archivo
  2. Directorio con una barra inclinada de entrenamiento
  3. Directorio sin barra inclinada de entrenamiento

mi solución es,

from pathlib import Path

def path_lastname(s):
    Path(s).with_name("foo").parts[-2]

Explicación

  • Path(s) – Crea un objeto Path personalizado a partir de s sin resolverlo.

  • .with_name("foo") – Agrega un archivo falso foo al camino

  • .parts[-2] devuelve la penúltima parte de la cadena. -1 parte será foo

¿Ha sido útil esta solución?