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
。这样做的原因是 split
和 dirname
正在做两件稍微不同的事情。 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 段 (..
) 的情况极为罕见,而且它们比其他任何情况都更有可能导致问题。
在 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
。这样做的原因是 split
和 dirname
正在做两件稍微不同的事情。 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 段 (..
) 的情况极为罕见,而且它们比其他任何情况都更有可能导致问题。