如何在Python中获取父目录?

如何在Python中获取父目录?,python,Python,有人能告诉我如何以跨平台的方式获取Python中路径的父目录吗。例如 C:\Program Files ---> C:\ 及 如果目录没有父目录,它将返回目录本身。这个问题可能看起来很简单,但我无法通过谷歌找到答案 os.path.abspath(os.path.join(somepath, '..')) 注意: import posixpath import ntpath print ntpath.abspath(ntpath.join('C:\\', '..')) print n

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

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

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

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', '..'))
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('..')
C:\程序文件
-->
C:\\\


C:\
-->
C:\\

使用
os.path.dirname

>>> os.path.dirname(r'C:\Program Files')
'C:\\'
>>> os.path.dirname('C:\\')
'C:\\'
>>>
警告:
os.path.dirname()
根据路径中是否包含尾随斜杠给出不同的结果。这可能是您想要的语义,也可能不是。使用
os.path.join(yourpath,os.pardir)
查看@kender的答案


您可以使用它来获取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 "------------------------------------------------------------"
获取父目录路径 例1 例2
因此,
有助于@kender的替代解决方案

import os.path

os.path.abspath(os.pardir)
import os
os.path.dirname(os.path.normpath(yourpath))
其中
yourpath
是您希望父对象的路径

import os
p = os.path.abspath('..')
但是这个解决方案并不完美,因为它不能处理
yourpath
是空字符串或点的情况

另一种解决方案可以更好地处理这种情况:

import os
os.path.normpath(os.path.join(yourpath, os.pardir))
这里可以找到的每种情况的输出(输入路径是相对的):

输入路径为绝对路径(Linux路径):

Pathlib方法(Python 3.4+) 传统方法

我应该使用哪种方法? 如果出现以下情况,请使用传统方法:

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

  • 您的Python版本低于3.4

  • 您需要一个字符串,并且收到了一个字符串。例如,假设您有一个表示文件路径的字符串,您希望获取父目录,以便将其放入JSON字符串中。如果转换为Pathlib对象并再次转换为Pathlib对象,那就有点傻了

如果以上任何一项都不适用,请使用Pathlib



什么是Pathlib? 如果您不知道Pathlib是什么,Pathlib模块是一个非常棒的模块,它可以让您更轻松地处理文件。大多数(如果不是所有)与文件一起工作的内置Python模块都将接受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')
p=Path(“/etc”) >>>q=p/'init.d'/'reboot' >>>q PosixPath('/etc/init.d/reboot') >>> PosixPath('/etc/rc.d/init.d/halt') 正在查询路径属性:

>>> q.exists()
True
>>> q.is_dir()
False
>
真的
>>> 
假的
如果您只希望作为参数提供文件的直接父级文件夹的名称,而该文件的绝对路径:

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

i、 e.使用
currentDir
/home/user/path/to/myfile/file.ext

上述命令将返回:


myfile

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

但是,如果您不使用
rstrip('/')
,那么您的输入是

>>> input = "../data/replies/"
会输出,

>>> os.path.dirname(input)
'../data/replies'
这可能不是您所看到的,因为您希望
“./data/replays/”
“./data/replays”
以相同的方式运行。

导入操作系统
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))
def父文件目录(n): 返回父文件目录(n,os.path.dirname(uuu文件)) def parent_filedir_iter(n,路径): n=int(n) 如果n 例如,在Windows中:

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

在Python2.7中尝试的两个示例上面给出的答案对于提升一个或两个目录级别都是非常好的,但是如果需要将目录树遍历多个级别(例如,5或10),它们可能会有点麻烦。这可以通过在
os.path.join
中加入一个
N
os.pardir
s列表来简洁地完成。例如:

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]

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

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

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

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

os.path.dirname(r'C:\Program Files')
什么?Python只是为您提供了文件“Program Files”所在的目录。更重要的是,它甚至不必存在,请注意:
os.path.dirname(r'c:\i\like\to\eat\pie')
outputs
'c:\\i\\like\\to\\eat'
原始海报没有说明目录必须存在。有许多路径名方法只执行字符串操作。要验证路径名是否确实存在,需要磁盘访问。这取决于应用程序,可能需要,也可能不需要。此解决方案对后续os.sep敏感。假设os.sep=='/'。dirname(foo/bar)->foo,但是dirname(foo/bar/)->foo/bart这是设计的。它归结为对带有尾随/的路径的解释。你认为“PAT1”等于“PAT1/1”吗?图书馆使用最普遍的解释,认为它们是不同的。在某些情况下,人们可能希望将它们视为等价物。在这种情况下,您可以先执行rstrip('/')。如果图书馆选择另一种解释,你将失去忠诚。@Ryan,我不知道这件事。有一个完整的RFC1808是为了解决URI中的相对路径问题以及尾部/的存在与否的所有微妙之处而编写的。如果你知道任何文件说他们应该被同等对待,请指出
>>> q.exists()
True
>>> q.is_dir()
False
>>> input = "../data/replies/"
>>> os.path.dirname(input.rstrip('/'))
'../data'
>>> input = "../data/replies"
>>> os.path.dirname(input.rstrip('/'))
'../data'
>>> input = "../data/replies/"
>>> os.path.dirname(input)
'../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>))
>>> my_path = '/home/user/documents'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'user'
>>> my_path = 'C:\WINDOWS\system32'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'WINDOWS'
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))
/home/User/P/Q/R
ROOT = os.path.abspath(os.path.join("..", os.pardir));
/home/User/P/Q/R
ROOT = os.path.abspath(os.path.join(".", os.pardir));