Hvilket Python-bibliotek kan jeg bruke til å trekke ut filnavn fra baner, uansett operativsystem eller baneformat?
For eksempel vil jeg at alle disse stiene skal returnere meg 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
Å bruke os.path.split
eller os.path.basename
som andre foreslår, vil ikke fungere i alle tilfeller: Hvis du kjører skriptet på Linux og prøver å behandle en klassisk Windows-sti, vil det mislykkes.
Windows-baner kan bruke enten backslash eller skråstrek som baneseparator. Derfor vil ntpath
-modulen (som tilsvarer os.path når den kjøres på Windows) fungere for alle(1) baner på alle plattformer.
import ntpath
ntpath.basename("a/b/c")
Selvfølgelig, hvis filen slutter med en skråstrek, vil basenavnet være tomt, så lag din egen funksjon for å håndtere det:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Verifisering:
>>> 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 er en advarsel: Linux-filnavn kan inneholde backslashes. Så på Linux refererer r'a/b\c'
alltid til filen b\c
i a
-mappen, mens det på Windows alltid refererer til c
-filen i undermappen b
i a
-mappen. Så når både forover- og bakoverskråstreker brukes i en bane, må du kjenne den tilknyttede plattformen for å kunne tolke den riktig. I praksis er det vanligvis trygt å anta at det er en Windows-bane siden backslashes sjelden brukes i Linux-filnavn, men husk dette når du koder slik at du ikke skaper utilsiktede sikkerhetshull;
os.path.splitt er funksjonen du leter etter
head, tail = os.path.split("/tmp/d/a.dat")
>>> print(tail)
a.dat
>>> print(head)
/tmp/d