Obtener el nombre de la carpeta del archivo en Python


87

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.splitdos veces:

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

¿Hay alguna forma mejor de hacerlo?


Respuestas:


162

Puede utilizar dirname:

os.path.dirname(path)

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

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

os.path.basename(path)

Devuelve el nombre base de la ruta de acceso. 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 nombre base para '/ foo / bar /' devuelve 'barra', la función nombre base () 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'

7
Alternativamente, para obtener la última porción, puede usaros.path.basename
mgilson

@mgilson buen punto! Actualicé mi respuesta para reflejar esto, muchas gracias
fedorqui 'SO deja de dañar'

17

Está buscando utilizar dirname . Si solo desea ese directorio, puede usar os.path.basename ,

Cuando se pone todo junto, se ve así:

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

Eso debería darte "other_sub_dir"

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

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

5
en lugar de dividir con str.split, es mejor usar os.path.split(que maneja mejor las diferencias de diferentes sistemas operativos).
mgilson

Si. ¡Tienes razón! Se me olvidó. Gracias @mgilson
idjaw

9

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)

8

os.path.dirname es lo que estas buscando -

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

Asegúrese de anteponer rla cadena para que se considere una cadena sin procesar.

Demo -

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

Si lo desea folder2, puede usar os.path.basenamecon lo anterior, Ejemplo -

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

Demo -

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

1

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 del final de la lista utilizando índices negativos.

Me gusta 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

1

puedes usar pathlib

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

El resultado de lo anterior fue este:

'folder2'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.