如何获得Python中的父目录?

有人能告诉我如何以跨平台的方式获取Pythonpath的父目录。 例如

C:\Program Files ---> C:\ 

 C:\ ---> C:\ 

如果目录没有父目录,则返回目录本身。 这个问题可能看起来很简单,但我无法通过Google进行挖掘。

尝试这个:

 import os.path print os.path.abspath(os.path.join(yourpath, os.pardir)) 

你的path是你想要的父path。

使用os.path.dirname

 >>> os.path.dirname(r'C:\Program Files') 'C:\\' >>> os.path.dirname('C:\\') 'C:\\' >>> 

注意: os.path.dirname()会根据path中是否包含尾部斜线给出不同的结果。 这可能是也可能不是你想要的语义。 参看 @ os.path.join(yourpath, os.pardir)的答案使用os.path.join(yourpath, os.pardir)

在Python 3.4+

 from pathlib import Path Path('C:\Program Files').parent 

doc页面


附加信息

新的pathlib库汇集并简化了使用path和通用文件操作。 以下是文档中的一些示例。

在目录树内导航:

 >>> >>> p = Path('/etc') >>> q = p / 'init.d' / 'reboot' >>> q PosixPath('/etc/init.d/reboot') >>> q.resolve() PosixPath('/etc/rc.d/init.d/halt') 

查询path属性:

 >>> >>> q.exists() True >>> q.is_dir() False 
 import os p = os.path.abspath('..') 

C:\Program Files —> C:\\\

C:\ – > C:\\\

 os.path.split(os.path.abspath(mydir))[0] 
 os.path.abspath(os.path.join(somepath, '..')) 

注意:

 import posixpath import ntpath print ntpath.abspath(ntpath.join('C:\\', '..')) print ntpath.abspath(ntpath.join('C:\\foo', '..')) print posixpath.abspath(posixpath.join('/', '..')) print posixpath.abspath(posixpath.join('/home', '..')) 

@kender的替代解决scheme

 import os os.path.dirname(os.path.normpath(yourpath)) 

你的path是你想要的父path。

但是这个解决scheme并不完美,因为它不能处理你的yourpath是空string或点的情况。

这个其他的解决scheme将更好地处理这个angular落的情况:

 import os os.path.normpath(os.path.join(yourpath, os.pardir)) 

这里可以find每种情况的输出(inputpath是相对的):

 os.path.dirname(os.path.normpath('a/b/')) => 'a' os.path.normpath(os.path.join('a/b/', os.pardir)) => 'a' os.path.dirname(os.path.normpath('a/b')) => 'a' os.path.normpath(os.path.join('a/b', os.pardir)) => 'a' os.path.dirname(os.path.normpath('a/')) => '' os.path.normpath(os.path.join('a/', os.pardir)) => '.' os.path.dirname(os.path.normpath('a')) => '' os.path.normpath(os.path.join('a', os.pardir)) => '.' os.path.dirname(os.path.normpath('.')) => '' os.path.normpath(os.path.join('.', os.pardir)) => '..' os.path.dirname(os.path.normpath('')) => '' os.path.normpath(os.path.join('', os.pardir)) => '..' os.path.dirname(os.path.normpath('..')) => '' os.path.normpath(os.path.join('..', os.pardir)) => '../..' 

inputpath是绝对的(Linuxpath):

 os.path.dirname(os.path.normpath('/a/b')) => '/a' os.path.normpath(os.path.join('/a/b', os.pardir)) => '/a' os.path.dirname(os.path.normpath('/a')) => '/' os.path.normpath(os.path.join('/a', os.pardir)) => '/' os.path.dirname(os.path.normpath('/')) => '/' os.path.normpath(os.path.join('/', os.pardir)) => '/' 
 import os print"------------------------------------------------------------" SITE_ROOT = os.path.dirname(os.path.realpath(__file__)) print("example 1: "+SITE_ROOT) PARENT_ROOT=os.path.abspath(os.path.join(SITE_ROOT, os.pardir)) print("example 2: "+PARENT_ROOT) GRANDPAPA_ROOT=os.path.abspath(os.path.join(PARENT_ROOT, os.pardir)) print("example 3: "+GRANDPAPA_ROOT) print "------------------------------------------------------------" 

只要在Tung的答案中添加一些东西(如果你使用的是unix的话,你需要使用rstrip('/')来更安全一些)。

 >>> input = "../data/replies/" >>> os.path.dirname(input.rstrip('/')) '../data' >>> input = "../data/replies" >>> os.path.dirname(input.rstrip('/')) '../data' 

但是,如果你不使用rstrip('/') ,给你的input是

 >>> input = "../data/replies/" 

会输出,

 >>> os.path.dirname(input) '../data/replies' 

这可能不是你正在看的,因为你想"../data/replies/""../data/replies"的行为方式相同。

 import os.path os.path.abspath(os.pardir) 

如果您只想将文件的直接父级文件夹的名称作为参数提供,而不是该文件的绝对path

os.path.split(os.path.dirname(currentDir))[1]

currentDir值为/home/user/path/to/myfile/file.ext

以上命令将返回:

myfile

 print os.path.abspath(os.path.join(os.getcwd(), os.path.pardir)) 

你可以使用这个来获取py文件当前位置的父目录。

获取父目录path创build新目录 (名称new_dir

获取父目录path

 os.path.abspath('..') os.pardir 

例1

 import os print os.makedirs(os.path.join(os.path.dirname(__file__), os.pardir, 'new_dir')) 

例2

 import os print os.makedirs(os.path.join(os.path.dirname(__file__), os.path.abspath('..'), 'new_dir')) 
 os.path.abspath('D:\Dir1\Dir2\..') >>> 'D:\Dir1' 

所以..帮助

 import os def parent_filedir(n): return parent_filedir_iter(n, os.path.dirname(__file__)) def parent_filedir_iter(n, path): n = int(n) if n <= 1: return path return parent_filedir_iter(n - 1, os.path.dirname(path)) test_dir = os.path.abspath(parent_filedir(2)) 
 import os dir_path = os.path.dirname(os.path.realpath(__file__)) parent_path = os.path.abspath(os.path.join(dir_path, os.pardir)) 

如果您还想要更实用的解决scheme,则可以执行以下操作,

 path="/home/a/c/c.txt" path.rsplit("/", 1)[0] Out[33]: '/home/a/c'