如何仅获取父目录的名称,而不是完整路径?

1 python path

我只想获取父目录的名称。意思是,只有它的最后一个组件,而不是完整路径。

例如,对于a/b/c/d/e我想要获取的路径d,而不是a/b/c/d.

我目前的代码:

import os

path = "C:/example/folder/file1.jpg"
directoryName = os.path.dirname(os.path.normpath(path)) 
print(directoryName)
Run Code Online (Sandbox Code Playgroud)

这会打印出来C:/example/folder,我只想得到folder.

Tom*_*koo 5

最简单的方法是使用pathlib. 使用parent将为您提供父级的完整路径,并且name只会为您提供最后一个组件:

>>> from pathlib import Path
>>> path = Path("/a/b/c/d/e")
>>> path.parent.name
'd'
Run Code Online (Sandbox Code Playgroud)

为了便于比较,做同样的os.path,你需要得到基本名称中的目录名称的路径。所以这直接转化为:

import os

path = "C:/example/folder/file1.jpg"
print(os.path.basename(os.path.dirname(path)))
Run Code Online (Sandbox Code Playgroud)

哪个是更好的版本:

os.path.split(os.path.split(path)[0])[1]
Run Code Online (Sandbox Code Playgroud)

两者都给出:

os.path.split(os.path.split(path)[0])[1]
Run Code Online (Sandbox Code Playgroud)

如您所见,该pathlib方法更加清晰易读。因为pathlib结合了 OOP 方法来表示路径,而不是字符串,所以我们得到了一个清晰的属性/方法调用链。

path.parent.name
Run Code Online (Sandbox Code Playgroud)

按顺序阅读为:

从路径开始 -> 取其父级 -> 取其名称

而在os函数接受字符串方法中,您实际上需要从内到外读取!

os.path.basename(os.path.dirname(path))
Run Code Online (Sandbox Code Playgroud)

按顺序阅读为:

路径的父级名称

我相信你会同意这更难阅读和理解(这只是一个简单的例子)。


您还可以将该str.split方法与os.sep

'folder'
Run Code Online (Sandbox Code Playgroud)

但正如文档所述:

请注意,知道这个 [(the separator)] 不足以解析或连接路径名——使用os.path.split()os.path.join() ——但它偶尔有用。

  • 为什么不使用 [pathlib](https://docs.python.org/3/library/pathlib.html)? (2认同)
  • @Tomerikoo [此](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) 可能是一个不错的起点。 (2认同)

Mis*_*agi 5

用于pathlib.Path获取.name.parent

from pathlib import Path

p = Path("C:/example/folder/file1.jpg")
print(p.parent.name)  # folder
Run Code Online (Sandbox Code Playgroud)

与 相比os.pathpathlib将路径表示为单独的类型而不是字符串。它通常更短并且使用更方便。

  • 如果您解释为什么“pathlib”模块现在比旧的“os.path”更受青睐,这会有所帮助 (2认同)