如何在Python中获取父目录?

时间:2010-05-18 18:55:42

标签: python

有人能告诉我如何以跨平台的方式在Python中获取路径的父目录。 E.g。

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

C:\ ---> C:\

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

19 个答案:

答案 0 :(得分:362)

试试这个:

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

其中yourpath是您希望父级的路径。

答案 1 :(得分:288)

使用os.path.dirname

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

警告:os.path.dirname()根据路径中是否包含尾部斜杠而给出不同的结果。这可能是也可能不是您想要的语义。参看@ kender使用os.path.join(yourpath, os.pardir)回答。

答案 2 :(得分:93)

在Python 3.4 +

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

Python documentation


其他信息

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

在目录树中导航:

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

查询路径属性:

>>>
>>> q.exists()
True
>>> q.is_dir()
False

答案 3 :(得分:23)

import os
p = os.path.abspath('..')

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

C:\ ---> C:\\\

答案 4 :(得分:18)

@kender

的替代解决方案
import os
os.path.dirname(os.path.normpath(yourpath))

其中yourpath是您希望父级的路径。

但是这个解决方案并不完美,因为它不会处理yourpath是空字符串或点的情况。

这个其他解决方案将更好地处理这个角落的情况:

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

这里可以找到的每种情况的输出(输入路径是相对的):

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))    => '../..'

输入路径是绝对的(Linux路径):

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))     => '/'

答案 5 :(得分:15)

os.path.split(os.path.abspath(mydir))[0]

答案 6 :(得分:13)

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', '..'))

答案 7 :(得分:7)

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 "------------------------------------------------------------"

答案 8 :(得分:4)

假设我们有类似的目录结构

1]

/home/User/P/Q/R

我们要从目录R访问“ P”的路径,然后可以使用

进行访问
ROOT = os.path.abspath(os.path.join("..", os.pardir));

2]

/home/User/P/Q/R

我们要从目录R访问“ Q”目录的路径,然后可以使用

进行访问
ROOT = os.path.abspath(os.path.join(".", os.pardir));

答案 9 :(得分:4)

如果您只想 名称 作为参数提供的文件的直接父级文件夹,不是 绝对路径到该文件:

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

即。 currentDir/home/user/path/to/myfile/file.ext

的值为myfile

上面的命令将返回:

.block margin 40px 0 text-align center &__support border 1px solid #ccc background white max-width 178px height 178px border-radius 100% margin-right 70px &__mobile @extends &__support

答案 10 :(得分:3)

>>> import os
>>> os.path.basename(os.path.dirname(<your_path>))

例如在Ubuntu中:

>>> my_path = '/home/user/documents'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'user'

例如在Windows中:

>>> my_path = 'C:\WINDOWS\system32'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'WINDOWS'

两个示例都在Python 2.7中尝试过

答案 11 :(得分:2)

import os.path

os.path.abspath(os.pardir)

答案 12 :(得分:2)

只需在Tung的回答中添加一些内容(如果您使用的是unix框,则需要使用rstrip('/')更加安全。)

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

但是,如果你没有使用rstrip('/'),那么你的输入是

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

会输出,

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

这可能不是您正在查看的内容,因为您希望"../data/replies/""../data/replies"的行为方式相同。

答案 13 :(得分:2)

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

您可以使用它来获取py文件当前位置的父目录。

答案 14 :(得分:1)

import os

dir_path = os.path.dirname(os.path.realpath(__file__))
parent_path = os.path.abspath(os.path.join(dir_path, os.pardir))

答案 15 :(得分:0)

os.path.abspath('D:\Dir1\Dir2\..')

>>> 'D:\Dir1'

所以..帮助

答案 16 :(得分:0)

获取家长目录路径制作新目录(名称new_dir

获取父目录路径

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'))

答案 17 :(得分:0)

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))

答案 18 :(得分:0)

上面给出的答案对于上移一个或两个目录级别都非常好,但是如果一个人需要遍历目录树许多级别(例如5或10),它们可能会变得有些麻烦。可以通过在N中加入os.pardir os.path.join个列表来简洁地完成此操作。示例:

import os
# Create list of ".." times 5
upup = [os.pardir]*5
# Extract list as arguments of join()
go_upup = os.path.join(*upup)
# Get abspath for current file
up_dir = os.path.abspath(os.path.join(__file__, go_upup))