如何在Python中获取父目录?

有人能告诉我如何在Python中跨平台获取路径的父目录吗?如。

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

而且

C:\ ---> C:\

如果目录没有父目录,则返回目录本身。这个问题似乎很简单,但我无法从谷歌中找到它。

781190 次浏览
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', '..'))
os.path.split(os.path.abspath(mydir))[0]

Python 3.4

使用pathlib模块。

from pathlib import Path
path = Path("/here/your/path/file.txt")
print(path.parent.absolute())

旧的答案

试试这个:

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

其中yourpath是你想要父路径的路径。

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

__abc0——> __abc1

__abc0——> __abc1

使用os.path.dirname:

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

注意:os.path.dirname()根据路径中是否包含后面的斜杠给出不同的结果。这可能是也可能不是您想要的语义。Cf. @kender的答案使用os.path.join(yourpath, os.pardir)

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

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

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

获取父目录路径创建新目录(名称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'))
os.path.abspath('D:\Dir1\Dir2\..')


>>> 'D:\Dir1'

所以..有帮助

import os.path


os.path.abspath(os.pardir)

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

Pathlib方法(Python 3.4+)

from pathlib import Path
Path('C:\Program Files').parent
# Returns a Pathlib object

传统方法

import os.path
os.path.dirname('C:\Program Files')
# Returns a string


我应该用哪种方法?

如果出现以下情况,请使用传统方法:

  • 如果要使用Pathlib对象,您会担心现有代码生成错误。(因为Pathlib对象不能与字符串连接。)

  • 您的Python版本低于3.4。

  • 你需要一个字符串,你收到了一个字符串。例如,你有一个表示文件路径的字符串,你想要得到父目录,这样你就可以把它放在一个JSON字符串中。转换为Pathlib对象然后再转换回来是很愚蠢的。

如果以上都不适用,请使用Pathlib。



什么是Pathlib?

如果你不知道Pathlib是什么,Pathlib模块是一个很棒的模块,它可以让你更容易地处理文件。大多数(如果不是全部的话)内建的处理文件的Python模块将同时接受Pathlib对象和字符串。我在下面突出显示了一些来自Pathlib文档的例子,它们展示了你可以用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

如果你想要只有作为参数提供的文件的直接父文件夹的< em >名称< / em >该文件的绝对路径:

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

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

上面的命令将返回:

myfile

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

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

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

>>> input1 = "../data/replies/"

将输出,

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

这可能不是你所看到的,因为你希望"../data/replies/""../data/replies"都以相同的方式表现。

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))
>>> 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中尝试的

上面给出的答案对于上升到一个或两个目录级别都非常合适,但是如果需要遍历目录树的许多级别(例如,5或10级),它们可能会有点麻烦。这可以通过在os.path.join中加入一个N __abc1列表来简单地完成。例子:

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

假设我们有这样的目录结构

1]

/home/User/P/Q/R

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

ROOT = os.path.abspath(os.path.join("..", os.pardir));

2]

/home/User/P/Q/R

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

ROOT = os.path.abspath(os.path.join(".", os.pardir));

查找当前工作目录的父目录。

import pathlib
pathlib.Path().resolve().parent
import os


def parent_directory():
# Create a relative path to the parent of the current working directory
relative_parent = os.path.join(os.getcwd(), "..") # .. means parent directory


# Return the absolute path of the parent directory
return os.path.abspath(relative_parent)


print(parent_directory())