您可以递归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对您不起作用,因为您没有正确地转义该字符串。