Dizeyi özyinelemeli os.path.splitolarak
import os
def parts(path):
p,f = os.path.split(path)
return parts(p) + [f] if f else [p]
Bunu bazı yol dizelerine karşı test etmek ve yolu yeniden birleştirmek os.path.join
>>> for path in [
... r'd:\stuff\morestuff\furtherdown\THEFILE.txt',
... '/path/to/file.txt',
... 'relative/path/to/file.txt',
... r'C:\path\to\file.txt',
... r'\\host\share\path\to\file.txt',
... ]:
... print parts(path), os.path.join(*parts(path))
...
['d:\\', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt'] d:\stuff\morestuff\furtherdown\THEFILE.txt
['/', 'path', 'to', 'file.txt'] /path\to\file.txt
['', 'relative', 'path', 'to', 'file.txt'] relative\path\to\file.txt
['C:\\', 'path', 'to', 'file.txt'] C:\path\to\file.txt
['\\\\', 'host', 'share', 'path', 'to', 'file.txt'] \\host\share\path\to\file.txt
Listenin ilk öğesine, sürücü harfleriyle, UNC yollarıyla ve mutlak ve göreli yollarla nasıl başa çıkmak istediğinize bağlı olarak farklı davranılması gerekebilir. Geçen değiştirme [p]için [os.path.splitdrive(p)]bölerek kuvvetlerin bir başlığın içine sürücü harfini ve dizin kök out sorunu.
import os
def parts(path):
p,f = os.path.split(path)
return parts(p) + [f] if f else [os.path.splitdrive(p)]
[('d:', '\\'), 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
[('', '/'), 'path', 'to', 'file.txt']
[('', ''), 'relative', 'path', 'to', 'file.txt']
[('C:', '\\'), 'path', 'to', 'file.txt']
[('', '\\\\'), 'host', 'share', 'path', 'to', 'file.txt']
Edit: Bu cevap yukarıda user1556435 tarafından verilene çok benzer olduğunu fark ettim . Yolun sürücü bileşeninin işlenmesi farklı olduğundan cevabımı bırakıyorum.
os.path.splitsizin için işe yaramadığını unutmayın, çünkü o dizeden düzgün şekilde kaçmıyorsunuz.