Le soluzioni proposte sono interessanti e offrono una buona referenza, tuttavia sono solo parzialmente soddisfacenti. Va bene aggiungere manualmente il separatore quando si ha un singolo caso specifico o si conosce il formato della stringa di input, ma ci possono essere casi in cui si desidera farlo a livello di codice su input generici.
Con un po 'di sperimentazione, credo che il criterio sia che il delimitatore di percorso non viene aggiunto se il primo segmento è una lettera di unità, ovvero una singola lettera seguita da due punti, indipendentemente dal fatto che corrisponda a un'unità reale.
Per esempio:
import os
testval = ['c:','c:\\','d:','j:','jr:','data:']
for t in testval:
print ('test value: ',t,', join to "folder"',os.path.join(t,'folder'))
test value: c: , join to "folder" c:folder
test value: c:\ , join to "folder" c:\folder
test value: d: , join to "folder" d:folder
test value: j: , join to "folder" j:folder
test value: jr: , join to "folder" jr:\folder
test value: data: , join to "folder" data:\folder
Un modo conveniente per verificare i criteri e applicare una correzione del percorso può essere quello di utilizzare il os.path.splitdrive
confronto del primo elemento restituito con il valore del test, come t+os.path.sep if os.path.splitdrive(t)[0]==t else t
.
Test:
for t in testval:
corrected = t+os.path.sep if os.path.splitdrive(t)[0]==t else t
print ('original: %s\tcorrected: %s'%(t,corrected),' join corrected->',os.path.join(corrected,'folder'))
original: c: corrected: c:\ join corrected-> c:\folder
original: c:\ corrected: c:\ join corrected-> c:\folder
original: d: corrected: d:\ join corrected-> d:\folder
original: j: corrected: j:\ join corrected-> j:\folder
original: jr: corrected: jr: join corrected-> jr:\folder
original: data: corrected: data: join corrected-> data:\folder
probabilmente può essere migliorato per essere più robusto per gli spazi finali, e l'ho testato solo su Windows, ma spero che dia un'idea. Vedi anche Os.path: puoi spiegare questo comportamento? per dettagli interessanti su sistemi diversi da Windows.