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?

Vasily
fuente

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'
fedorqui 'ASÍ que deja de hacer daño'
fuente
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]
idjaw
fuente
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)
dfresh22
fuente
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'
Anand S Kumar
fuente
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
tjd sydney
fuente
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'
Allen Jing
fuente