Katero knjižnico Python lahko uporabim za pridobivanje imen datotek iz poti, ne glede na operacijski sistem ali obliko poti?
Na primer, rad bi, da mi vse te poti vrnejo 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
Uporaba os.path.split
ali os.path.basename
, kot predlagajo drugi, ne bo delovala v vseh primerih: če skripto zaženete v Linuxu in poskušate obdelati klasično pot v okenskem slogu, vam ne bo uspelo.
Poti v sistemu Windows lahko kot ločilo poti uporabljajo bodisi povratno bodisi sprednjo poševnico. Zato bo modul ntpath
(ki je enakovreden os.path, kadar se izvaja v oknih) deloval za vse(1) poti na vseh platformah.
import ntpath
ntpath.basename("a/b/c")
Če se datoteka konča s poševnico, bo osnovno ime seveda prazno, zato za to naredite svojo funkcijo:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Preverjanje:
>>> 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) Tu je eno opozorilo: imena linuxnih datotek lahko vsebujejo povratne lomke*. Tako se v Linuxu r'a/b\c'
vedno nanaša na datoteko b\c
v mapi a
, medtem ko se v Windows vedno nanaša na datoteko c
v podmapi b
mape a
. Kadar se torej v poti uporabljata poševnica naprej in poševnica nazaj, morate poznati povezano platformo, da jo lahko pravilno interpretirate. V praksi je običajno varno domnevati, da gre za pot za Windows, saj se v imenih datotek v Linuxu le redko uporabljajo povratne lomke, vendar imejte to v mislih, ko programirate, da ne boste ustvarili naključne varnostne luknje.
os.path.split je funkcija, ki jo iščete
head, tail = os.path.split("/tmp/d/a.dat")
>>> print(tail)
a.dat
>>> print(head)
/tmp/d