Utiliser os.path.split
ou os.path.basename
comme d'autres le suggèrent ne fonctionnera pas dans tous les cas: si vous exécutez le script sous Linux et essayez de traiter un chemin de style Windows classique, il échouera.
Les chemins Windows peuvent utiliser une barre oblique inverse ou une barre oblique comme séparateur de chemin. Par conséquent, le ntpath
module (qui est équivalent à os.path lors de l'exécution sur Windows) fonctionnera pour tous les (1) chemins 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 nom de base sera vide, alors créez votre propre fonction pour y faire face:
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: les noms de fichiers Linux peuvent contenir des barres obliques inverses . Donc, sous Linux, r'a/b\c'
fait toujours référence au fichier b\c
dans le a
dossier, tandis que sous Windows, il fait toujours référence au c
fichier dans le b
sous- a
dossier du dossier. Ainsi, lorsque des barres obliques avant et arrière sont utilisées dans un chemin, vous devez connaître la plate-forme associée pour pouvoir l'interpréter correctement. Dans la pratique, il est généralement prudent de supposer qu'il s'agit d'un chemin Windows, car les barres obliques inverses sont rarement utilisées dans les noms de fichiers Linux, mais gardez cela à l'esprit lorsque vous codez afin de ne pas créer de failles de sécurité accidentelles.
os.path
charge simplement lentpath
module en interne. En utilisant ce module, il est possible de gérer les'\\'
séparateurs de chemin même sur les machines Linux. Pour Linux, leposixpath
module (resp.os.path
) Simplifiera les opérations de chemin pour n'autoriser que les'/'
séparateurs de style posix .r'C:\path\to\file.txt'
) sur une machine Linux, que vous devez utiliser le module ntpath. Sinon, vous pouvez utiliser les fonctions de os.path. Cela est dû au fait que les systèmes Linux autorisent normalement l'utilisation de la barre oblique inverse dans les noms de fichiers (comme expliqué dans la réponse).os.path.basename(os.path.normpath(path))
?En fait, il y a une fonction qui retourne exactement ce que vous voulez
la source
os.path.basename(your_path)
Ça a marché! Je voulais chemin du script:os.path.dirname(os.path.realpath(__file__))
et nom du script:os.path.basename(os.path.realpath(__file__))
. Merci!'C:\\temp\\bla.txt'
place.os.path.split est la fonction que vous recherchez
la source
En python 3
la source
queue est ce que vous voulez, le nom de fichier.
Voir la documentation du module os python pour plus de détails
la source
la source
Dans votre exemple, vous devrez également supprimer la barre oblique de droite à droite pour revenir
c
:Deuxième niveau:
mise à jour: je pense
lazyr
a fourni la bonne réponse. Mon code ne fonctionnera pas avec des chemins de type Windows sur les systèmes Unix et vice-versa avec des chemins de type Unix sur le système Windows.la source
r"a\b\c"
sous Linux, ni pour"a/b/c"
Windows.os.path.basename(path)
ne fonctionnera que sios.path.isfile(path)
c'est le casTrue
. Cepath = 'a/b/c/'
n'est donc pas du tout un nom de fichier valide ...os.path.basename("a/b/c/")
renvoie en""
raison de la barre oblique de fin.lazyr
tu as raison! Je n'y ai pas pensé. Serait-il sûr de le fairepath = path.replace('\\', '/')
?cela renverra: paint.exe
la source
fname = str(path).split('/')[-1]
Si vous souhaitez obtenir le nom de fichier automatiquement, vous pouvez le faire
la source
Si votre chemin de fichier ne se termine pas par "/" et les répertoires séparés par "/", utilisez le code suivant. Comme nous le savons, le chemin ne se termine généralement pas par "/".
Mais dans certains cas, comme les URL se terminent par "/", utilisez le code suivant
mais lorsque votre chemin est ponctué de "\" que vous trouvez généralement dans les chemins Windows, vous pouvez utiliser les codes suivants
Vous pouvez combiner les deux en une seule fonction en vérifiant le type de système d'exploitation et en renvoyant le résultat.
la source
Cela fonctionne pour Linux et Windows ainsi qu'avec la bibliothèque standard
Résultats:
la source
Voici une solution uniquement regex, qui semble fonctionner avec n'importe quel chemin de système d'exploitation sur n'importe quel système d'exploitation.
Aucun autre module n'est nécessaire, et aucun prétraitement n'est nécessaire non plus:
Mise à jour:
Si vous voulez seulement un potentiel nom de fichier, le cas échéant (c. -à-
/a/b/
est un répertoire et est doncc:\windows\
), changer l'expression rationnelle à:r'[^\\/]+(?![\\/])$'
. Pour le «regex contesté», cela change le lookahead avant positif pour une sorte de barre oblique en un lookahead avant négatif, ce qui fait que les chemins d'accès qui se terminent par cette barre oblique ne retournent rien au lieu du dernier sous-répertoire du chemin d'accès. Bien sûr, il n'y a aucune garantie que le nom de fichier potentiel se réfère réellement à un fichier et pour celaos.path.is_dir()
ouos.path.is_file()
devrait être utilisé.Cela correspondra comme suit:
Le regex peut être testé ici .
la source
Peut-être juste ma solution tout-en-un sans importante nouvelle (considérez le fichier temporaire pour créer des fichiers temporaires: D)
Obtenir les valeurs de
abc.name
sera une chaîne comme celle-ci:'/tmp/tmpks5oksk7'
je peux donc remplacer le/
par un espace.replace("/", " ")
, puis appelersplit()
. Cela renverra une liste et j'obtiens le dernier élément de la liste avec[-1]
Pas besoin d'importer un module.
la source
Je n'ai jamais vu de chemins à double contre-oblique, existent-ils? La fonctionnalité intégrée du module python
os
échoue pour ceux-ci. Tous les autres fonctionnent, ainsi que la mise en garde que vous avez faite avecos.path.normpath()
:la source
Le séparateur Windows peut être dans un nom de fichier Unix ou un chemin Windows. Le séparateur Unix ne peut exister que dans le chemin Unix. La présence d'un séparateur Unix indique un chemin non Windows.
Les éléments suivants seront supprimés (couper le séparateur de fin) par le séparateur spécifique au système d'exploitation, puis diviser et retourner la valeur la plus à droite. C'est moche, mais simple basé sur l'hypothèse ci-dessus. Si l'hypothèse est incorrecte, veuillez la mettre à jour et je mettrai à jour cette réponse pour qu'elle corresponde aux conditions les plus précises.
exemple de code:
la source
Par souci d'exhaustivité, voici la
pathlib
solution pour python 3.2+:Cela fonctionne sur Windows et Linux.
la source
En Python 2 et 3, en utilisant le module pathlib2 :
Usage:
Avec votre testcase:
L'idée ici est de convertir tous les chemins en une représentation interne unifiée de
pathlib2
, avec différents décodeurs selon la plateforme. Heureusement,pathlib2
inclut un décodeur générique appeléPurePath
qui devrait fonctionner sur n'importe quel chemin. Si cela ne fonctionne pas, vous pouvez forcer la reconnaissance du chemin d'accès Windows à l'aide defromwinpath=True
. Cela divisera la chaîne d'entrée en parties, la dernière est la feuille que vous recherchez, d'où lepath2unix(t)[-1]
.Si l'argument
nojoin=False
, le chemin sera joint en arrière, de sorte que la sortie est simplement la chaîne d'entrée convertie au format Unix, ce qui peut être utile pour comparer les sous-chemins entre les plates-formes.la source