似乎有(至少)两种不同的方法获得Python中的父目录路径,这两种方法我都见过。下面的等价物还是我错过了什么?pythons找到父目录的替代方案
os.path.dirname(my_dir)
os.path.join(my_dir, os.pardir)
前者是更短的,但可能不太清楚(特别是上升时超过1层)。我努力想到os.pardir或os.path.pardir的任何其他可能的用途?
的Python禅:“应该有one--和最好只有一个--obvious办法做到这一点”
似乎有(至少)两种不同的方法获得Python中的父目录路径,这两种方法我都见过。下面的等价物还是我错过了什么?pythons找到父目录的替代方案
os.path.dirname(my_dir)
os.path.join(my_dir, os.pardir)
前者是更短的,但可能不太清楚(特别是上升时超过1层)。我努力想到os.pardir或os.path.pardir的任何其他可能的用途?
的Python禅:“应该有one--和最好只有一个--obvious办法做到这一点”
它们不等价。
的区别在于如何与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段(..
)的场景极为罕见,它们更可能导致问题而非其他问题。
这是令我困惑的斜线: 'os.path.dirname('/ foo/bar /')!= os.path.dirname('/ foo/bar /')' where ' os.path.join('/ foo/bar /',os.pardir)== os.path.join('/ foo/bar',os.pardir)' 我会在未来尝试使用pathlib: ) – David258
检查以下行。父目录由第一个目录给出(在这种情况下,对于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
只是返回您提供的路径的目录。
所以os.path.dirname("/foo/bar/file.txt")
将返回/foo/bar
和os.path.dirname("/foo/bar/")
也将返回/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
正在返回父目录的名称和文件名,而dirname
仅返回第一部分,实质上是上述行的简写方法。
pardir
确实没有太多用例。如果你想看到一些,请查看this。
上一个目录的明显方法将是第一个,不是吗? –