我找不到有效的方法来做到这一点。描述我试图做什么的最好方法是通过例子,所以我们要去哪里(假设/bar/是父级(:
C:foobarbaztext.txt
将是我的路。我对所有东西都感兴趣,直到路径的顶级父目录。我需要的是一个能做到这一点的剧本。换句话说,我只想获取
barbaztext.txt
拆分对我不起作用。它会拆分文件和路径,但不会给出这样的输出。我是缺少内置功能还是SOL?谢谢
您可以始终使用string.split()
:
>>> print '\' + path.split('\', 2)[-1]
barbaztext.txt
不确定您想要什么,但您可以使用鲜为人知的rsplit,它从字符串的右侧进行拆分。
>>> filepath = r"C:foobarbaztext.txt"
>>> directories_deep = 3
>>> os.path.sep.join(filepath.rsplit(os.path.sep, directories_deep)[-directories_deep:])
'bar\baz\text.txt'
我不知道你说"顶级父目录"是什么意思。您的顶级目录是C:
。什么的家长?如果你试图获得一个从当前工作目录的父目录开始的相对路径,请尝试以下操作:
import os.path
os.path.relpath("C:\foo\bar\baz\text.txt", os.path.dirname(os.path.realpath('..')))
我创建了一个助手函数来完成这项工作:
import os
def get_path_tail(path, tail_length = 1):
assert isinstance(tail_length, int)
if tail_length == 1:
return path.split('/')[-tail_length]
elif tail_length > 1:
return os.path.join(*path.split('/')[-tail_length:])
行为:
>>> path = os.path.join('C:','foo','bar', 'baz','text.txt')
>>> print get_path_tail(path, tail_length = 3)
bar/baz/text.txt
它的签名就像ForeverWintr的回答中那样,但我无法评论他的回答,因为我还没有足够的声誉。:(
In [44]: path = 'a/b/c'
In [45]: back = os.path.relpath('.', os.path.join(path, '..'))
In [46]: back
Out[46]: '..\..'
In [47]: tail = os.path.relpath(path, os.path.join(path, back)))
In [48]: tail
Out[48]: 'b\c'
阿卡不,我不知道。
我会保持简单。将cwd和输入路径转换为绝对路径,然后只使用startswitch和切片
path = os.path.abspath(path)
#Make sure you finish curDir with a path separator
#to avoid incorrect partial matches
curDir = os.path.abspath(".") + os.path.sep
if path.startswith(curDir):
whatYouWant = path[len(curDir) - 1:]
以下是我解决这个问题的方法:
def gettail(path_, length):
elements = []
for i in range(length):
s = os.path.split(path_)
elements.append(s[1])
path_ = s[0]
outpath = elements.pop()
while elements:
outpath = os.path.join(outpath, elements.pop())
return outpath
输出:
>>> print gettail(r"C:foobarbaztext.txt", 3)
'bar\baz\text.txt'
欢迎提出建议/改进。