有人能告诉我如何以跨平台的方式在Python中获取路径的父目录。 E.g。
C:\Program Files ---> C:\
和
C:\ ---> C:\
如果目录没有父目录,则返回目录本身。问题可能看似简单,但我无法通过Google进行挖掘。
答案 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
其他信息
新的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
import os
print os.makedirs(os.path.join(os.path.dirname(__file__), os.pardir, 'new_dir'))
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))