Welke Python bibliotheek kan ik gebruiken om bestandsnamen uit paden te extraheren, ongeacht het besturingssysteem of het padformaat?
Bijvoorbeeld, ik zou willen dat al deze paden mij c
opleveren:
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
Het gebruik van os.path.split
of os.path.basename
zoals anderen suggereren zal niet in alle gevallen werken: als je het script op Linux uitvoert en probeert een klassiek windows-stijl pad te verwerken, zal het mislukken.
Windows paden kunnen zowel een backslash als een forward slash gebruiken als pad scheidingsteken. Daarom zal de ntpath
module (die gelijk is aan os.path als je het op windows draait) werken voor alle(1) paden op alle platforms.
import ntpath
ntpath.basename("a/b/c")
Natuurlijk, als het bestand eindigt met een schuine streep, zal de basisnaam leeg zijn, dus maak je eigen functie om hiermee om te gaan:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Verificatie:
>>> 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) Er's één caveat: Linux bestandsnamen mogen backslashes bevatten. Dus op Linux verwijst r'a/b\c'
altijd naar het bestand b\c
in de a
map, terwijl het op Windows altijd verwijst naar het c
bestand in de b
submap van de a
map. Dus als zowel voorwaartse als achterwaartse slashes worden gebruikt in een pad, moet je het bijbehorende platform kennen om het correct te kunnen interpreteren. In de praktijk is het meestal veilig om aan te nemen dat het een Windows-pad is, omdat backslashes zelden worden gebruikt in Linux-bestandsnamen, maar houd dit in gedachten als je codeert, zodat je geen onbedoelde veiligheidslekken creëert.
os.path.split is de functie die u zoekt
head, tail = os.path.split("/tmp/d/a.dat")
>>> print(tail)
a.dat
>>> print(head)
/tmp/d