Pythons 寻找父目录替代品

Pythons finding parent directory alternatives

在 Python 中似乎有(至少)两种不同的获取父目录路径的方法,这两种方法我都见过。以下是等效项还是我遗漏了什么?

os.path.dirname(my_dir)

os.path.join(my_dir, os.pardir)

前者较短,但可能不太清楚(尤其是在超过一层时)。我正在努力想 os.pardir 或 os.path.pardir?

的任何其他可能用途

Zen of Python: "There should be one-- and preferably only one --obvious way to do it"

检查以下几行。父目录由第一个给出(在本例中,html 是 /var/www)。 os.pardir 显示一个“..”,它是几乎大多数基于 Windows 和 POSIX 的操作系统用来引用父目录的常量。当你用 'my_dir' 加入它时,你会得到 my_dir + '..' 这不是你可能需要的。

>>> import os
>>> a = "/var/www/html"
>>> os.path.dirname(a)
'/var/www'
>>> os.path.join(a, os.pardir)
'/var/www/html/..'
>>> 

这两件事并不等同。如果您阅读 documentation,您会发现 dirname 只是 return 您提供的路径目录。

所以 os.path.dirname("/foo/bar/file.txt") 会 return /foo/bar 并且 os.path.dirname("/foo/bar/") 也会 return /foo/bar

顾名思义,os.path.join 将路径片段连接在一起。

因此,如果我想获得 /foo/bar/file.txt,我可以使用 os.path.join("/foo/bar/", "file.txt")。在您给出的示例中,os.path.join("/foo/bar/", os.pardir) 会给出 /foo/bar/...

另一种经常使用的方法是:

parent, _ = os.path.split("/foo/bar/file.txt")

其中parent为父目录,_赋值为file.txt。这样做的原因是 splitdirname 正在做两件稍微不同的事情。 split 是 return 父目录的名称和文件名,而 dirname 只是 return 的第一部分,本质上是 shorthand上面一行的方法。

pardir 的用例确实不多。如果你想看一些,请查看 this

它们不等同。

区别在于如何处理以os.sep结尾的路径:

>>> os.path.dirname('/foo/bar/')
'/foo/bar'

但是:

>>> os.path.join('/foo/bar/', os.pardir)
'/foo/bar/..'
>>> os.path.abspath('/foo/bar/..')
'/foo'

那么你应该使用哪一个?两者都不。使用 pathlib module 代替:

>>> from pathlib import Path
>>> Path('/foo/bar/').parent
PosixPath('/foo')
>>> str(Path('/foo/bar/').parent)
'/foo'

如果您绝对不能使用 pathlib,请坚持使用 os.path.dirname。您希望在文件路径中包含 pardir 段 (..) 的情况极为罕见,而且它们比其他任何情况都更有可能导致问题。