你可能希望以一种与操作系统无关的方式来完成这个任务。在这种情况下,您应该使用
os.path
例程来实现。然而,
os.path.split()
与普通的
split()
不同,因此您不能直接将其用于所需的操作。
您可以使用
splitall(path)
方法
这里。我不会包含代码,因为我没有编写它,所以我只会链接到它。
splitall()
重复使用
os.path.split()
来拆分路径。
它返回一个包含路径组件的列表。然后,您可以通过对返回的列表执行切片操作来选择最后三个组件。如果您想要将最后三个组件再次合并为路径,则应使用
os.path.join()
。
我在Stack Overflow上找到了一个版本这里,我更喜欢它。我已经链接到答案,但由于它在该网站上(因此受CC BY-SA保护),我将更充分地展开并在此处包含代码。警告,我只在Windows上测试过,但应适用于其他操作系统。如果不行,请告诉我。
import os
def split_path(path):
folders = []
drive, path = os.path.splitdrive(path)
while True:
path, folder = os.path.split(path)
if folder:
folders.append(folder)
else:
if path:
folders.append(path)
break
if drive:
folders.append(drive)
return folders[::-1]
我在测试@Andreas的答案时,仅使用
os.path.normpath(path).split(os.sep)[-2:]
而不是
os.sep.join()
,因为我将其用于生成文件夹列表,代替上面的
splitall()
/
split_path()
以获取所有路径组件的列表。从我的角度来看,这是一个更加常用的工具,尽管我承认它对于OP的问题并非必需。
在这种情况下,
split(os.sep)
做错了事情。它使用前导分隔符作为分隔符(显然),因此返回一个空路径元素,而不是前导根目录(即分隔符)。当您想要一个目录组件列表时,这是错误的。当您包括join时,这不明显,因为当您将前导空条目与其余条目连接起来时,它会将其与分隔符一起连接到前面。因此,在一般的非连接情况下,我认为这是有问题的。
为了完整起见,下面的
reconstruct_path()
将从文件夹列表重建路径。它将处理Windows上的驱动器,包括包含驱动器的相对路径,这可能是一件事。
import os
import sys
def reconstruct_path(folders):
folders = folders[:]
path = ""
if sys.platform == 'win32' and ':' == folders[0][-1]:
path = folders[0]
del folders[0]
if folders and folders[0] == os.sep:
path += folders[0]
del folders[0]
path += os.sep.join(folders)
return path
splitall()
而不是上面的方法,它返回所有路径组件的列表。在这种情况下,它会出现错误,因为它使用前导分隔符作为分隔符(显然),所以它返回一个空路径元素,而不是前导根目录(即分隔符)。当您想要一个目录组件列表时,这是错误的。join()
隐藏了这一点,因为当您将前导空条目与其余部分连接起来时,它会使用分隔符将其添加到前面。在一般非join()
情况下仍然存在问题。 - Glenn Mackintosh