我有一条路:
path = foo/bar/baz
我想确定基础是什么。在此示例中,它应返回“foo”。
我尝试了几种方法:
root = re.search('(.+?)/(.+)', path).group(1)
paths = path.split('/')[0]
root = paths[0] if paths[0] or len(paths) <= 1 else '/'.join(paths[0:2])
def rootname(path):
head,tail = os.path.split(path)
if head != '':
return rootname(head)
else:
return path
root = rootname(path)
是否有更多'Pythonic'方式来访问根目录?
即
root = os.path.''rootname''(path)
答案 0 :(得分:13)
>>> import os
>>> path = '/foo/bar/baz'
>>> path = path.lstrip(os.sep) # Get rid of leading "/" if any
>>> root = path[:path.index(os.sep)] if os.sep in path else path
>>> root
'foo'
答案 1 :(得分:3)
如果你正在寻找一个完全符合你想要的内置函数或stdlib函数,那就没有了。
如果您正在寻找第三方库,请尝试搜索PyPI和ActiveState。你会发现像pathlib
这样的路径操作库(目前正在考虑包含在Python 3.4中),Unipath
和forked-path
(都是基于早期的库,其修改版本是考虑但从未被接受包含在Python 2)中,还有数十种。 (或者,如果您使用的是twisted
或PyQt
这样的框架,则可能会内置一个框架。)
使用这样的库,通常可以在一行中获取根路径,例如:
pathlib.Path(mypath).parts[0]
Unipath.Path(mypath).split_root()[0]
Unipath.Path(mypath).components()[0]
path.path(mypath).splitall()[0]
他们对“根”的定义可能与你的完全不同。 (正如JF Sebastian指出的那样,我们实际上并不确切地知道你对“root”的定义是什么,因此很难猜测它是否会匹配...)所以,你可能仍然需要这种代码:
components = path.path(mypath).splitall()[0]
return components[0] if len(components[0]) > 1 else components[0]/components[1]
但不管怎样,它比做正则表达式和字符串操作更好。
(事实上,即使你不使用第三方库,你应该尝试用os.path
函数而不是字符串函数构建所有东西 - 这样,当你明年在Windows上尝试它,很有可能它开箱即用,如果没有,它可能只需要很小的改动,而不是绝对保证它不会工作,可能需要一个完整的重写。)
答案 2 :(得分:1)
如果我理解了这些要求,你希望该目录不在根目录下,除非它是一个相对路径,那么你希望该目录离开你是相对的吗?你不会找到一个内置函数来处理这样的事情。但如果真的你需要什么,请使用类似你的第二种“方式”。我会使用os.path.sep而不是'/'。
答案 3 :(得分:1)
要获取路径所属的root的子目录 - “基本”目录:
p = os.path
unc, rest = getattr(p, 'splitunc', lambda s: ('', s))(p.abspath(path))
drive, rest = p.splitdrive(rest)
basedir = p.join(unc, drive, p.sep, rest and rest.split(p.sep, 2)[1])
在Unix上,代码可以简化:splitunc()
,splitdrive()
可以省略。
答案 4 :(得分:0)
单行os.path.splitdrive(checkedpath)[0]
答案 5 :(得分:0)
类似于彼得的回答:
root = path.lstrip(os.sep).split(os.sep)[0]