Obtenir le nom du dossier du fichier en Python

87

En Python, quelle commande dois-je utiliser pour obtenir le nom du dossier contenant le fichier avec lequel je travaille?

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

Ici "folder2" ce que je veux obtenir.

La seule chose que j'ai proposée est d'utiliser os.path.splitdeux fois:

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

Y a-t-il une meilleure façon de le faire?

Vasily
la source

Réponses:

163

Vous pouvez utiliser dirname:

os.path.dirname(path)

Renvoie le nom du répertoire du chemin du chemin. C'est le premier élément de la paire retourné en passant le chemin à la fonction split ().

Et étant donné le chemin complet, vous pouvez vous séparer normalement pour obtenir la dernière partie du chemin. Par exemple, en utilisant basename:

os.path.basename(path)

Renvoie le nom de base du chemin du chemin. C'est le deuxième élément de la paire retourné en passant le chemin à la fonction split (). Notez que le résultat de cette fonction est différent du programme de nom de base Unix; où basename pour '/ foo / bar /' renvoie 'bar', la fonction basename () renvoie une chaîne vide ('').


Tous ensemble:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'
fedorqui 'Alors arrêtez de nuire'
la source
7
Alternativement, pour obtenir la dernière portion, vous pouvez utiliseros.path.basename
mgilson
@mgilson bon point! J'ai mis à jour ma réponse pour refléter cela, merci beaucoup
fedorqui 'Alors arrêtez de nuire'
17

Vous cherchez à utiliser dirname . Si vous ne voulez que ce répertoire, vous pouvez utiliser os.path.basename ,

Une fois réunis, cela ressemble à ceci:

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

Cela devrait vous donner "other_sub_dir"

Ce qui suit n'est pas l'approche idéale, mais j'ai initialement proposé, en utilisant os.path.split, et obtenir simplement le dernier élément. qui ressemblerait à ceci:

os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1]
idjaw
la source
5
plutôt que de diviser avec str.split, il est préférable d'utiliser os.path.split(qui gère mieux les différences des différents systèmes d'exploitation).
mgilson
Oui. Tu as raison! J'ai glissé mon esprit. Merci @mgilson
idjaw
9

c'est assez ancien, mais si vous utilisez Python 3.4 ou supérieur, utilisez 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
la source
8

os.path.dirname est ce que vous recherchez -

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

Assurez-vous de précéder rla chaîne afin qu'elle soit considérée comme une chaîne brute.

Démo -

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

Si vous voulez juste folder2, vous pouvez utiliser os.path.basenameavec l'exemple ci-dessus -

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

Démo -

In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
Out[48]: 'folder2'
Anand S Kumar
la source
1

Vous pouvez obtenir le chemin complet sous forme de chaîne, puis le diviser en une liste à l'aide du caractère séparateur de votre système d'exploitation. Ensuite, vous obtenez le nom du programme, le nom du dossier, etc. en accédant aux éléments de la fin de la liste à l'aide d'indices négatifs.

Comme ça:

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]}" )

La sortie de ce qui précède était la suivante:

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
la source
1

vous pouvez utiliser pathlib

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

La sortie de ce qui précède était la suivante:

'folder2'
Allen Jing
la source