有人能告诉我如何以跨平台的方式在Python中获取路径的父目录.例如
C:\Program Files ---> C:\
Run Code Online (Sandbox Code Playgroud)
和
C:\ ---> C:\
Run Code Online (Sandbox Code Playgroud)
如果目录没有父目录,则返回目录本身.问题可能看似简单,但我无法通过谷歌进行挖掘.
ken*_*der 412
试试这个:
from pathlib import Path
path = Path("/here/your/path/file.txt")
print(path.parent)
Run Code Online (Sandbox Code Playgroud)
pathlib您想要父母的路径在哪里.
Wai*_*ung 306
使用os.path.dirname:
>>> os.path.dirname(r'C:\Program Files')
'C:\\'
>>> os.path.dirname('C:\\')
'C:\\'
>>>
Run Code Online (Sandbox Code Playgroud)
警告:os.path.dirname()根据路径中是否包含尾部斜杠,给出不同的结果.这可能是也可能不是您想要的语义.参看 @kender的答案使用os.path.join(yourpath, os.pardir).
wp-*_*com 104
在Python 3.4+中
from pathlib import Path
Path('C:\Program Files').parent
Run Code Online (Sandbox Code Playgroud)
附加信息
新的pathlib库汇集并简化了使用路径和常见文件操作.以下是文档中的一些示例.
在目录树中导航:
>>>
>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')
Run Code Online (Sandbox Code Playgroud)
查询路径属性:
>>>
>>> q.exists()
True
>>> q.is_dir()
False
Run Code Online (Sandbox Code Playgroud)
ivo*_*ivo 32
import os
p = os.path.abspath('..')
Run Code Online (Sandbox Code Playgroud)
C:\Program Files ---> C:\\\
C:\ ---> C:\\\
ben*_*bin 25
@kender的另一种解决方案
import os
os.path.dirname(os.path.normpath(yourpath))
Run Code Online (Sandbox Code Playgroud)
yourpath您想要父母的路径在哪里.
但是这个解决方案并不完美,因为它不会处理yourpath空字符串或点的情况.
这个其他解决方案将更好地处理这个角落的情况:
import os
os.path.normpath(os.path.join(yourpath, os.pardir))
Run Code Online (Sandbox Code Playgroud)
这里可以找到的每种情况的输出(输入路径是相对的):
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)) => '../..'
Run Code Online (Sandbox Code Playgroud)
输入路径是绝对的(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)) => '/'
Run Code Online (Sandbox Code Playgroud)
Dan*_*nes 18
os.path.split(os.path.abspath(mydir))[0]
Run Code Online (Sandbox Code Playgroud)
Ign*_*ams 13
os.path.abspath(os.path.join(somepath, '..'))
Run Code Online (Sandbox Code Playgroud)
注意:
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', '..'))
Run Code Online (Sandbox Code Playgroud)
小智 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 "------------------------------------------------------------"
Run Code Online (Sandbox Code Playgroud)
>>> import os
>>> os.path.basename(os.path.dirname(<your_path>))
Run Code Online (Sandbox Code Playgroud)
例如在 Ubuntu 中:
>>> my_path = '/home/user/documents'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'user'
Run Code Online (Sandbox Code Playgroud)
例如在 Windows 中:
>>> my_path = 'C:\WINDOWS\system32'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'WINDOWS'
Run Code Online (Sandbox Code Playgroud)
这两个例子都在 Python 2.7 中尝试过
如果你想只的名称是作为参数,并提供该文件的直接父文件夹的不是的绝对路径到该文件中:
os.path.split(os.path.dirname(currentDir))[1]
即具有的currentDir值/home/user/path/to/myfile/file.ext
上面的命令将返回:
myfile
假设我们有这样的目录结构
1]
/home/User/P/Q/R
Run Code Online (Sandbox Code Playgroud)
我们想从目录 R 访问“P”的路径,然后我们可以使用
ROOT = os.path.abspath(os.path.join("..", os.pardir));
Run Code Online (Sandbox Code Playgroud)
2]
/home/User/P/Q/R
Run Code Online (Sandbox Code Playgroud)
我们想从目录 R 访问“Q”目录的路径,然后我们可以使用
ROOT = os.path.abspath(os.path.join(".", os.pardir));
Run Code Online (Sandbox Code Playgroud)