os.path.split文字列を再帰的にすることができます
import os
def parts(path):
p,f = os.path.split(path)
return parts(p) + [f] if f else [p]
これをいくつかのパス文字列に対してテストし、パスを再構成して 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
リストの最初の要素は、ドライブ文字、UNCパス、および絶対パスと相対パスをどのように処理するかによって、異なる処理が必要になる場合があります。最後[p]を変更して[os.path.splitdrive(p)]、ドライブ文字とディレクトリのルートをタプルに分割することで問題を強制します。
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']
編集:私はこの答えは非常によく似ていることを認識している上に与えられたものでuser1556435。パスのドライブコンポーネントの処理が異なるので、答えはお任せします。
os.path.splitするとき、その文字列を適切にエスケープしていないため、は機能しないことに注意してください。