Millist Pythoni raamatukogu saan kasutada failinimede väljavõtmiseks teekonnast, olenemata sellest, milline on operatsioonisüsteem või teekonna formaat?
Näiteks tahaksin, et kõik need teekonnad annaksid mulle tagasi 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
Kasutades os.path.split
või os.path.basename
, nagu teised soovitavad, ei tööta kõigil juhtudel: kui te käivitate skripti Linuxis ja püüate töödelda klassikalist Windowsi-stiilis teed, siis see ebaõnnestub.
Windowsi teekonnad võivad kasutada teekonna eraldajana kas backslash'i või forward slash'i. Seetõttu töötab moodul ntpath
(mis on võrdväärne os.path'iga, kui seda kasutatakse Windowsis) kõikide(1) teede puhul kõigil platvormidel.
import ntpath
ntpath.basename("a/b/c")
Loomulikult, kui fail lõpeb kaldkriipsuga, on baasnimi tühi, seega tehke oma funktsioon, mis sellega tegeleb:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Kontrollimine:
>>> 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) On üks hoiatus: Linuxi failinimed võivad sisaldada kaldkriipsu. Nii et Linuxis viitab r'a/b\c'
alati failile b\c
kaustas a
, samas kui Windowsis viitab see alati failile c
kausta a
alamkaustas b
. Nii et kui teekonnas kasutatakse nii ees- kui ka tagurpidi kaldkriipsu, peate te vajalik teadma sellega seotud platvormi, et seda õigesti tõlgendada. Praktikas on tavaliselt turvaline eeldada, et tegemist on Windowsi teega, kuna Linuxi failinimedes kasutatakse harva tagurpidi kaldkriipsu, kuid pidage seda koodimisel meeles, et mitte tekitada juhuslikke turvaauke.
os.path.split on funktsioon, mida te otsite
head, tail = os.path.split("/tmp/d/a.dat")
>>> print(tail)
a.dat
>>> print(head)
/tmp/d