8

我有一条路径:

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”的方式来访问根目录?

IE

root = os.path.''rootname''(path)
4

6 回答 6

15
>>> 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'
于 2013-12-08T02:17:09.023 回答
3

如果您正在寻找完全符合您要求的内置或 stdlib 函数,那么没有。

如果您正在寻找第三方库,请尝试搜索 PyPI 和 ActiveState。您会发现路径操作库,如pathlib(自 Python 3.4 以来已包含)Unipathforked-path(均基于较早的库,其修改版本被考虑但从未接受包含在 Python 2 中)等等。(或者,如果您使用的是twistedor之类的框架PyQt,它可能内置了一个。)

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

pathlib.Path(mypath).parts[0]
Unipath.Path(mypath).split_root()[0]
Unipath.Path(mypath).components()[0]
path.path(mypath).splitall()[0]

他们对“根”的定义可能与您的不完全相同。(正如 JF Sebastian 指出的那样,我们实际上并不确切知道您对“根”的定义是什么,所以很难猜测它是否会匹配......)所以,您可能仍然需要这种代码:

components = path.path(mypath).splitall()[0]
return components[0] if len(components[0]) > 1 else components[0]/components[1]

但无论如何,它会比进行正则表达式和字符串操作更好。

(事实上​​,即使你使用第三方库,你也应该尝试用os.path函数而不是字符串函数来构建所有东西——那样,当你明年在 Windows 上尝试它时,很有可能它会开箱即用,如果不是,它可能只需要很小的更改,而不是绝对保证它不会工作并且可能需要完全重写。)

于 2012-12-18T23:13:43.320 回答
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()可以省略。

于 2012-12-18T21:12:25.300 回答
1

如果我了解要求,您希望该目录脱离根目录,除非它是相对路径,否则您希望该目录脱离您的相对位置?你不会找到一个内置函数来处理类似的事情。但是,如果这确实是您需要的,请使用类似于您的第二种“方式”的方法。不过,我会使用 os.path.sep 而不是 '/'。

于 2012-12-18T20:17:02.740 回答
1

类似于彼得的回答:

root = path.lstrip(os.sep).split(os.sep)[0]
于 2020-01-27T11:18:39.110 回答
0

单线os.path.splitdrive(checkedpath)[0]

于 2014-11-05T14:37:00.333 回答