如何在Python中获取父目录?

问题描述 投票:0回答:21

有人可以告诉我如何以跨平台的方式获取Python中路径的父目录吗?例如

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

C:\ ---> C:\

如果目录没有父目录,则返回目录本身。这个问题看起来很简单,但我无法通过谷歌找到它。

python
21个回答
786
投票

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
是您想要父级的路径。


407
投票

使用

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)


163
投票

使用 Pathlib(自 起可用)

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 对象无法连接到字符串。Pathlib 对象可以连接到 Pathlib 对象,因此如果您正在启动一个新项目并在各处使用 Pathlib,那就没问题了。)

  • 您的Python版本低于3.4。

  • 您正在将文件路径放在一起以供当前 Python 程序之外的使用(将路径发送到计算机上运行的其他服务、将路径存储在数据库中等),并且您没有获得任何 Pathlib 对象从...开始。举例来说,您有一个文件路径,它当前是一个字符串,并且您想要获取父目录,以便可以将其放入一些 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

50
投票
import os
p = os.path.abspath('..')

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

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


36
投票

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

20
投票
os.path.split(os.path.abspath(mydir))[0]
    

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

11
投票
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 "------------------------------------------------------------"
    

10
投票
>>> 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 中尝试过


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

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

6
投票
如果您

作为参数提供的文件的直接父级文件夹的名称,而不该文件的绝对路径

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



currentDir

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


以上命令将返回:

myfile


    


4
投票
import os dir_path = os.path.dirname(os.path.realpath(__file__)) parent_path = os.path.abspath(os.path.join(dir_path, os.pardir))
    

3
投票
import os.path os.path.abspath(os.pardir)
    

3
投票
只需在 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"
 表现相同。


2
投票
print os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))

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


1
投票
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())
    

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

0
投票
os.path.abspath('D:\Dir1\Dir2\..') >>> 'D:\Dir1'

所以

..

有帮助


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

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

0
投票
查找当前工作目录的父目录:

import pathlib pathlib.Path().resolve().parent
    
© www.soinside.com 2019 - 2024. All rights reserved.