Запропоновані рішення цікаві та пропонують хороші рекомендації, проте вони задовольняють лише частково. Добре додавати роздільник вручну, коли у вас є окремий конкретний випадок або ви знаєте формат вхідного рядка, але бувають випадки, коли ви хочете зробити це програмно на загальних входах.
Трохи експериментуючи, я вважаю, що критерієм є те, що роздільник шляху не додається, якщо перший сегмент є буквою диска, що означає одну букву, за якою слідує двокрапка, незалежно від того, чи відповідає вона реальній одиниці.
Наприклад:
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
Зручним способом перевірити критерії та застосувати корекцію шляху може бути використання os.path.splitdrive
порівняння першого поверненого елемента із тестовим значенням, наприклад t+os.path.sep if os.path.splitdrive(t)[0]==t else t
.
Тест:
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
його, можливо, можна вдосконалити, щоб він був більш надійним для кінцевих просторів, і я протестував його лише на вікнах, але, сподіваюся, це дає ідею. Дивіться також Os.path: чи можете ви пояснити таку поведінку? для цікавих деталей про системи, що не є вікнами.