Die vorgeschlagenen Lösungen sind interessant und bieten eine gute Referenz, sind jedoch nur teilweise zufriedenstellend. Es ist in Ordnung, das Trennzeichen manuell hinzuzufügen, wenn Sie einen bestimmten Fall haben oder das Format der Eingabezeichenfolge kennen. Es kann jedoch Fälle geben, in denen Sie dies programmgesteuert für generische Eingaben tun möchten.
Mit ein wenig Experimentieren glaube ich, dass das Kriterium darin besteht, dass der Pfadbegrenzer nicht hinzugefügt wird, wenn das erste Segment ein Laufwerksbuchstabe ist, dh ein einzelner Buchstabe, gefolgt von einem Doppelpunkt, unabhängig davon, ob er einer realen Einheit entspricht.
Beispielsweise:
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
Eine bequeme Möglichkeit, die Kriterien zu testen und eine Pfadkorrektur anzuwenden, besteht darin os.path.splitdrive
, das erste zurückgegebene Element mit dem Testwert zu vergleichen, z t+os.path.sep if os.path.splitdrive(t)[0]==t else t
.
Prüfung:
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
Es kann wahrscheinlich verbessert werden, um für nachfolgende Leerzeichen robuster zu sein, und ich habe es nur unter Windows getestet, aber ich hoffe, es gibt eine Idee. Siehe auch Os.path: Können Sie dieses Verhalten erklären? für interessante Details zu anderen Systemen als Windows.