Extrahera filnamn från sökvägen, oavsett formatet os/path

Vilket Python-bibliotek kan jag använda för att extrahera filnamn från sökvägar, oavsett operativsystem eller sökvägsformat?

Jag vill till exempel att alla dessa sökvägar ska ge mig 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
Lösning

Att använda os.path.split eller os.path.basename som andra föreslår fungerar inte i alla fall: om du kör skriptet på Linux och försöker bearbeta en klassisk sökväg i Windows-stil kommer det att misslyckas.

Windows-stigar kan använda antingen backslash eller forward slash som stigseparator. Därför kommer modulen ntpath (som motsvarar os.path när den körs på Windows) att fungera för alla(1) sökvägar på alla plattformar.

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

Om filen slutar med ett snedstreck kommer naturligtvis basnamnet att vara tomt, så gör en egen funktion för att hantera det:

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

Verifiering:

>>> 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) Det finns ett förbehåll: Linux filnamn kan innehålla backslashes. Så på Linux hänvisar r'a/b\c' alltid till filen b\c i mappen a, medan det på Windows alltid hänvisar till filen c i undermappen b i mappen a. Så när både framåt- och bakåtriktade snedstreck används i en sökväg måste du känna till den tillhörande plattformen för att kunna tolka den korrekt. I praktiken är det oftast säkert att anta att det är en Windows-sökväg eftersom backslashes sällan används i Linux-filnamn, men tänk på detta när du kodar så att du inte skapar oavsiktliga säkerhetshål.

Kommentarer (7)

os.path.split är den funktion du söker

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

>>> print(tail)
a.dat
>>> print(head)
/tmp/d
Kommentarer (3)
import os
head, tail = os.path.split(p)
print tail

Anta att p är inmatningssträngen, tail är vad du vill ha.

Se python os module docs för detaljer.

Kommentarer (1)