2017-08-11 72 views
2

似乎有(至少)两种不同的方法获得Python中的父目录路径,这两种方法我都见过。下面的等价物还是我错过了什么?pythons找到父目录的替代方案

os.path.dirname(my_dir) 

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

前者是更短的,但可能不太清楚(特别是上升时超过1层)。我努力想到os.pardir或os.path.pardir的任何其他可能的用途?

的Python禅:“应该有one--和最好只有一个--obvious办法做到这一点”

+0

上一个目录的明显方法将是第一个,不是吗? –

回答

1

它们不等价。

的区别在于如何与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段(..)的场景极为罕见,它们更可能导致问题而非其他问题。

+0

这是令我困惑的斜线: '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

0

检查以下行。父目录由第一个目录给出(在这种情况下,对于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/..' 
>>> 
0

这两件事情是不相等的。如果您阅读documentation,您会看到dirname只是返回您提供的路径的目录。

所以os.path.dirname("/foo/bar/file.txt")将返回/foo/baros.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。原因是splitdirname正在做两个稍微不同的事情。 split正在返回父目录的名称和文件名,而dirname仅返回第一部分,实质上是上述行的简写方法。

pardir确实没有太多用例。如果你想看到一些,请查看this