Quale libreria Python posso usare per estrarre i nomi dei file dai percorsi, indipendentemente dal sistema operativo o dal formato del percorso?
Per esempio, vorrei che tutti questi percorsi mi restituissero 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
Usare os.path.split
o os.path.basename
come altri suggeriscono non funzionerà in tutti i casi: se state eseguendo lo script su Linux e tentate di elaborare un percorso classico stile Windows, fallirà.
I percorsi di Windows possono usare sia backslash che forward slash come separatore di percorso. Pertanto, il modulo ntpath
(che è equivalente a os.path quando viene eseguito su windows) funzionerà per tutti(1) i percorsi su tutte le piattaforme.
import ntpath
ntpath.basename("a/b/c")
Naturalmente, se il file finisce con una barra, il nome base sarà vuoto, quindi create la vostra funzione per occuparvene:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Verifica:
>>> 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']
{\a6}}}}
(1) C'è un avvertimento: i nomi dei file su Linux possono contenere backslash. Quindi su linux, r'a/b\c'
si riferisce sempre al file b\c
nella cartella a
, mentre su Windows, si riferisce sempre al file c
nella sottocartella b
della cartella a
. Quindi, quando in un percorso si usano sia slash in avanti che indietro, è necessario conoscere la piattaforma associata per poterlo interpretare correttamente. In pratica di solito è sicuro assumere che si tratti di un percorso di Windows, dato che le barre rovesciate sono raramente usate nei nomi di file di Linux, ma tenetelo a mente quando scrivete il codice in modo da non creare accidentali buchi di sicurezza;
os.path.split è la funzione che state cercando
head, tail = os.path.split("/tmp/d/a.dat")
>>> print(tail)
a.dat
>>> print(head)
/tmp/d