1319 votes

Python, extrait de nom de fichier à partir du chemin, peu importe ce que les os/format de chemin d'accès

Qui bibliothèque Python puis-je utiliser pour extraire le fichier des noms de chemins d'accès, quel que soit le système d'exploitation ou le format de chemin d'accès peut être ?

Par exemple, j'aimerais que tous ces chemins de me rendre "c" :

a/b/c/
a/b/c
\a\b\c
\a\b\c\
a\b\c
a/b/../../a/b/c/
a/b/../../a/b/c

1885voto

stranac Points 3038

En fait, il y a une fonction qui renvoie exactement ce que vous voulez

print os.path.basename(your_path)

1059voto

Lauritz V. Thaulow Points 12146

À l'aide de os.path.split ou os.path.basename que d'autres suggèrent de ne pas fonctionner dans tous les cas: si vous exécutez le script sous Linux et tenter de procéder à un classique de style windows chemin d'accès, il échouera.

Les chemins d'accès Windows pouvez utiliser une barre oblique ou oblique comme séparateur de chemin. Par conséquent, l' ntpath module (qui est équivalent à l'os.chemin d'accès lors de l'exécution sur windows) sera le même pour tous(1) les chemins d'accès sur toutes les plates-formes.

import ntpath
ntpath.basename("a/b/c")

Bien sûr, si le fichier se termine par une barre oblique, le préfixe sera vide, alors faites votre propre fonction pour traiter avec elle:

def path_leaf(path):
    head, tail = ntpath.split(path)
    return tail or ntpath.basename(head)

Vérification:

>>> paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c', 
...     'a/b/../../a/b/c/', 'a/b/../../a/b/c']
>>> [path_leaf(path) for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']


(1) Il y a une mise en garde: Linux les noms de fichiers peuvent contenir des barres obliques inverses. Donc sur linux, r'a/b\c' se réfère toujours pour le fichier b\c dans la a le dossier, alors que sur Windows, il se réfère toujours à l' c le fichier dans l' b sous-dossier de l' a le dossier. Alors, quand à la fois en avant et en arrière des barres obliques sont utilisés dans un chemin, vous avez besoin de savoir l'associé plate-forme pour être en mesure de les interpréter correctement. Dans la pratique, il est généralement plus sûr de supposer que c'est un chemin d'accès windows depuis des barres obliques inverses sont rarement utilisés dans les noms de fichiers Linux, mais gardez cela à l'esprit lorsque vous code afin de ne pas créer accidentelle des trous de sécurité.

390voto

Jakob Bowyer Points 12873

os.chemin d'accès.split est la fonction vous êtes à la recherche pour

head, tail = os.path.split("/tmp/d/a.dat")

>>> print tail
a.dat
>>> print head
/tmp/d

89voto

number5 Points 3749
import os
head, tail = os.path.split(p)
print tail

Supposons que p est la chaîne d'entrée, la queue est ce que vous voulez.

Voir python module os docs pour le détail

15voto

Ski Points 5884

Dans votre exemple, vous aurez également besoin de la bande de slash à partir de la droite la droite pour revenir c:

>>> import os
>>> path = 'a/b/c/'
>>> path = path.rstrip(os.sep) # strip the slash from the right side
>>> os.path.basename(path)
'c'

Deuxième niveau:

>>> os.path.filename(os.path.dirname(path))
'b'

mise à jour: je pense que lazyr a fourni la bonne réponse. Mon code ne fonctionne pas avec windows-comme des chemins, sur les systèmes unix et vice rapport avec unix-comme des chemins sur le système windows.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X