Bạn có thể đệ quy os.path.splitchuỗi
import os
def parts(path):
p,f = os.path.split(path)
return parts(p) + [f] if f else [p]
Kiểm tra điều này với một số chuỗi đường dẫn và gắn lại đường dẫn với 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
Phần tử đầu tiên của danh sách có thể cần được xử lý khác nhau tùy thuộc vào cách bạn muốn xử lý ký tự ổ đĩa, đường dẫn UNC và đường dẫn tuyệt đối và tương đối. Thay đổi cái cuối cùng [p]để [os.path.splitdrive(p)]buộc vấn đề bằng cách tách ký tự ổ đĩa và thư mục gốc thành một bộ.
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']
Chỉnh sửa: Tôi đã nhận ra rằng câu trả lời này rất giống với câu trả lời ở trên của user1556435 . Tôi đang để lại câu trả lời của mình vì việc xử lý thành phần ổ đĩa của đường dẫn là khác nhau.
os.path.splitnó không hiệu quả với bạn vì bạn không thoát khỏi chuỗi đó đúng cách.