Proponowane rozwiązania są ciekawe i stanowią dobrą referencję, ale tylko częściowo satysfakcjonują. Ręczne dodawanie separatora jest ok, gdy masz jedną konkretną przypadek lub znasz format ciągu wejściowego, ale mogą wystąpić przypadki, w których chcesz to zrobić programowo na ogólnych danych wejściowych.
Po odrobinie eksperymentowania uważam, że kryterium jest takie, że ogranicznik ścieżki nie jest dodawany, jeśli pierwszy segment jest literą dysku, co oznacza pojedynczą literę, po której następuje dwukropek, bez względu na to, czy odpowiada rzeczywistej jednostce.
Na przykład:
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
Wygodnym sposobem sprawdzenia kryteriów i zastosowania korekty ścieżki może być os.path.splitdrive
porównanie pierwszego zwróconego elementu z wartością testową, na przykład 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
prawdopodobnie można go ulepszyć, aby był bardziej odporny na spacje końcowe, a testowałem go tylko na oknach, ale mam nadzieję, że daje pomysł. Zobacz także Os. Ścieżka: czy możesz wyjaśnić to zachowanie? dla interesujących szczegółów systemów innych niż okna.