Las soluciones propuestas son interesantes y ofrecen una buena referencia, sin embargo, solo satisfacen parcialmente. Está bien agregar manualmente el separador cuando tiene un solo caso específico o conoce el formato de la cadena de entrada, pero puede haber casos en los que desee hacerlo mediante programación en entradas genéricas.
Con un poco de experimentación, creo que el criterio es que el delimitador de ruta no se agrega si el primer segmento es una letra de unidad, es decir, una sola letra seguida de dos puntos, sin importar si corresponde a una unidad real.
Por ejemplo:
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
Una forma conveniente de probar los criterios y aplicar una corrección de ruta puede ser os.path.splitdrive
comparar el primer elemento devuelto con el valor de prueba, como t+os.path.sep if os.path.splitdrive(t)[0]==t else t
.
Prueba:
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
Probablemente se pueda mejorar para que sea más robusto para los espacios finales, y lo he probado solo en Windows, pero espero que dé una idea. Consulte también Os.path: ¿puede explicar este comportamiento? para obtener detalles interesantes sobre sistemas distintos de Windows.