我找不到有效的方法来做到这一点。描述我想要做的事情的最好方法是通过示例,所以我们去哪里(假设/ bar /是父母):
C:\foo\bar\baz\text.txt
将成为我的道路。我对路径的顶级父目录的所有内容感兴趣。我需要的是一个可以做到这一点的脚本。换句话说,我只想抓住
\bar\baz\text.txt
Split对我不起作用。它将拆分文件和路径,但它不会像这样给出输出。是否有内置功能我缺少或我是SOL?谢谢!
答案 0 :(得分:1)
您可以随时使用string.split()
:
>>> print '\\' + path.split('\\', 2)[-1]
\bar\baz\text.txt
答案 1 :(得分:1)
当你说“顶级父目录”时,我不确定你的意思。您的顶级目录是C:\
。什么?如果您尝试获取以当前工作目录的父目录开头的相对路径,请尝试以下操作:
import os.path
os.path.relpath("C:\\foo\\bar\\baz\\text.txt", os.path.dirname(os.path.realpath('..')))
答案 2 :(得分:1)
不确定你想要什么,但你可以使用鲜为人知的 rsplit ,它从字符串的右侧分开。
>>> filepath = r"C:\foo\bar\baz\text.txt"
>>> directories_deep = 3
>>> os.path.sep.join(filepath.rsplit(os.path.sep, directories_deep)[-directories_deep:])
'bar\\baz\\text.txt'
答案 3 :(得分:1)
我创建了一个辅助函数来完成这项工作:
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
它的签名就像answer ForeverWintr中的签名一样,但由于我还没有足够的声誉,我无法评论他的回答。 :)
答案 4 :(得分:0)
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'
Aka不是我所知道的。
答案 5 :(得分:0)
我会保持简单。将cwd和输入路径转换为绝对路径,然后只使用startswith和切片
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:]
答案 6 :(得分:0)
以下是我解决这个问题的方法:
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:\foo\bar\baz\text.txt", 3)
'bar\\baz\\text.txt'
建议/改进欢迎。