Comment puis-je extraire le chemin du dossier du chemin du fichier en Python?

116

Je voudrais obtenir uniquement le chemin du dossier à partir du chemin complet vers un fichier.

Par exemple T:\Data\DBDesign\DBDesign_93_v141b.mdbet je voudrais obtenir juste T:\Data\DBDesign(à l'exclusion du \DBDesign_93_v141b.mdb).

J'ai essayé quelque chose comme ça:

existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = str(existGDBPath.split('\\')[0:-1])
print wkspFldr 

mais cela m'a donné un résultat comme celui-ci:

['T:', 'Data', 'DBDesign']

ce qui n'est pas le résultat que j'exige (être T:\Data\DBDesign).

Des idées sur la façon dont je peux obtenir le chemin de mon fichier?

Genspec
la source

Réponses:

140

Vous étiez presque là avec votre utilisation de la splitfonction. Vous aviez juste besoin de joindre les chaînes, comme suit.

>>> import os
>>> '\\'.join(existGDBPath.split('\\')[0:-1])
'T:\\Data\\DBDesign'

Bien que je recommande d'utiliser la os.path.dirnamefonction pour ce faire, il vous suffit de passer la chaîne et elle fera le travail pour vous. Puisque vous semblez être sous Windows, pensez également à utiliser la abspathfonction. Un exemple:

>>> import os
>>> os.path.dirname(os.path.abspath(existGDBPath))
'T:\\Data\\DBDesign'

Si vous voulez à la fois le nom du fichier et le chemin du répertoire après avoir été fractionnés, vous pouvez utiliser la os.path.splitfonction qui renvoie un tuple, comme suit.

>>> import os
>>> os.path.split(os.path.abspath(existGDBPath))
('T:\\Data\\DBDesign', 'DBDesign_93_v141b.mdb')
Sukrit Kalra
la source
os.sep.join(existGDBPath.split(os.sep)[:-1]semble plus jolie.
Dave Babbitt
88

AVEC MODULE PATHLIB (RÉPONSE MIS À JOUR)

Il faut envisager d'utiliser pathlib pour les nouveaux développements. Il se trouve dans le stdlib pour Python3.4, mais disponible sur PyPI pour les versions antérieures. Cette bibliothèque fournit une méthode plus orientée objet pour manipuler les chemins <opinion>et est beaucoup plus facile à lire et à programmer avec </opinion>.

>>> import pathlib
>>> existGDBPath = pathlib.Path(r'T:\Data\DBDesign\DBDesign_93_v141b.mdb')
>>> wkspFldr = existGDBPath.parent
>>> print wkspFldr
Path('T:\Data\DBDesign')

AVEC MODULE OS

Utilisez le module os.path :

>>> import os
>>> existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
>>> wkspFldr = os.path.dirname(existGDBPath)
>>> print wkspFldr 
'T:\Data\DBDesign'

Vous pouvez continuer et supposer que si vous avez besoin de faire une sorte de manipulation de nom de fichier, elle a déjà été implémentée dans os.path. Sinon, vous devrez probablement utiliser ce module comme bloc de construction.

SethMMorton
la source
Path().parentce que je cherchais!
iedmrc le
44

Le sous-module intégré os.path a une fonction pour cette tâche.

import os
os.path.dirname('T:\Data\DBDesign\DBDesign_93_v141b.mdb')
Dan Allan
la source
4

Voici le code:

import os
existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = os.path.dirname(existGDBPath)
print wkspFldr # T:\Data\DBDesign
Victor Lellis
la source
0

Voici mon petit utilitaire d'aide pour diviser les chemins int, les jetons de chemin:

import os    
# usage: file, path = splitPath(s)
def splitPath(s):
    f = os.path.basename(s)
    p = s[:-(len(f))-1]
    return f, p
Timothy C. Quinn
la source
0

Toute personne essayant de le faire dans l'interface de calcul de champ ESRI GIS Table peut le faire avec l' analyseur Python :

PathToContainingFolder =

"\\".join(!FullFilePathWithFileName!.split("\\")[0:-1])

pour que

\ Users \ me \ Desktop \ Nouveau dossier \ file.txt

devient

\ Users \ me \ Desktop \ Nouveau dossier

Fermeture éclair1365
la source