Предлагаемые решения интересны и служат хорошим ориентиром, однако удовлетворяют лишь частично. Можно вручную добавить разделитель, если у вас есть один конкретный случай или вы знаете формат входной строки, но могут быть случаи, когда вы хотите сделать это программно для общих входов.
Немного поэкспериментировав, я считаю, что критерием является то, что разделитель пути не добавляется, если первый сегмент является буквой диска, то есть одной буквой, за которой следует двоеточие, независимо от того, соответствует ли она реальной единице.
Например:
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
его, вероятно, можно улучшить, чтобы он стал более устойчивым к конечным пробелам, и я тестировал его только в Windows, но я надеюсь, что это дает представление. См. Также Os.path: вы можете объяснить такое поведение? для получения интересных подробностей о других системах, кроме Windows.