找到路径的根

时间:2012-12-18 19:43:56

标签: python regex

我有一条路:

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)

6 个答案:

答案 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中),Unipathforked-path(都是基于早期的库,其修改版本是考虑但从未被接受包含在Python 2)中,还有数十种。 (或者,如果您使用的是twistedPyQt这样的框架,则可能会内置一个框架。)

使用这样的库,通常可以在一行中获取根路径,例如:

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]