Sto imparando Python e ho notato qualcosa di strano con uno dei miei script. Facendo un po 'di test ho scoperto il problema derivava da questo comportamento:Perché os.path.join elimina argomenti?
>>> import os
>>> os.path.join('a','b')
'a/b'
>>> os.path.join('a','/b')
'/b'
Controllo del documentation, questo è, infatti, la progettazione della funzione:
os.path. unirsi (path1[, path2[, ... ]])
far parte di uno o più componenti del percorso intelligente. Se qualsiasi componente è un percorso assoluto, tutti i componenti precedenti (su Windows, inclusa la precedente lettera di unità, se ce n'è uno) vengono gettati via e l'unione continua. ...
La mia domanda non è why my script failed, ma piuttosto perché la funzione è stato progettato in questo modo. Voglio dire, su Unix almeno, a//b
è un modo perfettamente accettabile per designare un percorso, se non elegante. Perché la funzione è stata progettata in questo modo? C'è un modo per dire se uno o più elementi del percorso sono stati scartati prima di testare ogni stringa di percorso con os.path.isabs()
?
Per curiosità, ho anche controllato il caso in cui un componente di percorso termina in un carattere os.sep
:
>>> os.path.join('a/','b')
'a/b'
che funziona come previsto.
Un modo facile, anche se inelegante, per controllare ciò è fare 'filename.lstrip ('/')' – voithos
@voithos Renderlo 'filename.lstrip (os.sep)' ed è portabile alle principali piattaforme. – delnan
@delnan: dovresti testare su windows, dove è 'os.sep + '/'' .. –