python:获取目录上两层
python: get directory two levels up
好的...我不知道模块 x
在哪里,但我知道我需要获取上两级目录的路径。
那么,有没有更优雅的做法:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
欢迎 Python 2 和 3 的解决方案!
您可以使用 pathlib
. Unfortunately this is only available in the stdlib for Python 3.4. If you have an older version you'll have to install a copy from PyPI here。使用 pip
.
应该很容易做到
from pathlib import Path
p = Path(__file__).parents[1]
print(p)
# /absolute/path/to/two/levels/up
这使用 parents
序列提供对父目录的访问并选择第二个。
请注意,在这种情况下,p
将是某种形式的 Path
对象,具有自己的方法。如果您需要字符串形式的路径,则可以对它们调用 str
。
很简单:
这是你想要的:
import os.path as path
two_up = path.abspath(path.join(__file__ ,"../.."))
就我个人而言,我发现使用 os 模块是最简单的方法,如下所述。如果您只升一级,请将 ('../..') 替换为 ('..').
import os
os.chdir('../..')
--Check:
os.getcwd()
我还没有看到 2.7 的可行答案,它不需要安装额外的依赖项并且也从文件的目录开始。它作为单行解决方案并不好,但使用标准实用程序没有错。
import os
grandparent_dir = os.path.abspath( # Convert into absolute path string
os.path.join( # Current file's grandparent directory
os.path.join( # Current file's parent directory
os.path.dirname( # Current file's directory
os.path.abspath(__file__) # Current file path
),
os.pardir
),
os.pardir
)
)
print grandparent_dir
为了证明它有效,我在这里从 ~/Documents/notes
开始,只是为了显示当前目录不会影响结果。我将带有该脚本的文件 grandpa.py
放在名为 "scripts" 的文件夹中。它向上爬到 Documents 目录,然后爬到 Mac.
上的用户目录
(testing)AlanSE-OSX:notes AlanSE$ echo ~/Documents/scripts/grandpa.py
/Users/alancoding/Documents/scripts/grandpa.py
(testing)AlanSE-OSX:notes AlanSE$ python2.7 ~/Documents/scripts/grandpa.py
/Users/alancoding
这是 the answer for the parent dir 的明显外推。使用通用解决方案比使用较少行的不太好的解决方案更好。
我发现以下内容在 2.7.x
中效果很好
import os
two_up = os.path.normpath(os.path.join(__file__,'../'))
您可以将其用作通用解决方案:
import os
def getParentDir(path, level=1):
return os.path.normpath( os.path.join(path, *([".."] * level)) )
将目录提升 2 级:
import os.path as path
curr_dir=Path(os.path.dirname(os.path.abspath(__file__)))
two_dir_up_=os.fspath(Path(curr_dir.parent.parent).resolve())
我已经完成了以下操作以向上两个并向下钻取其他目录
default_config_dir=os.fspath(Path(curr_dir.parent.parent,
'data/config').resolve())
我本来打算添加这个只是为了愚蠢,但也是因为它向新手展示了别名函数 and/or 导入的潜在用途。
写完后,我认为这段代码比迄今为止的其他答案更具可读性(即掌握意图的时间更短),可读性(通常)是王道。
from os.path import dirname as up
two_up = up(up(__file__))
注意:只有当您的模块非常小或上下文相关时,您才想做这种事情。
更多跨平台实现将是:
import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
Windows 不支持使用 parent
。还需要添加 .resolve()
, 到:
Make the path absolute, resolving all symlinks on the way and also normalizing it (for example turning slashes into backslashes under Windows)
从任何目录执行时的最佳解决方案(对于 python >= 3.4)是:
from pathlib import Path
two_up = Path(__file__).resolve().parents[1]
假设您要访问 python 文件中名为 xzy 的两个文件夹。这对我和平台无关。
".././xyz"
(pathlib.Path('../../')).resolve()
100% 有效答案:
os.path.abspath(os.path.join(os.getcwd() ,"../.."))
已经有一个公认的答案,但对于两个级别,我认为链接方法可以说更具可读性:
pathlib.Path(__file__).parent.parent.resolve()
令人惊讶的是,似乎还没有人探索过这个不错的单行选项:
import os
two_up = os.path.normpath(__file__).rsplit(os.sep, maxsplit=2)[0]
rsplit
很有趣,因为 maxsplit
参数直接表示要向上移动多少个父文件夹,它总是 returns 结果只通过路径一次。
使用 Pathlib(在 Python 3.5 之后推荐,the/a 通用解决方案不仅适用于 file.py 文件,而且适用于 Jupyter(或其他类型的)笔记本和 Python shell 是:
p = Path.cwd().resolve().parents[1]
您只需将 (__file__)
替换为 cwd()
(当前工作目录)。
事实上,它甚至可以用于:
p = Path().resolve().parents[1]
(当然还有 .parent.parent
而不是 parents[1]
)
好的...我不知道模块 x
在哪里,但我知道我需要获取上两级目录的路径。
那么,有没有更优雅的做法:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
欢迎 Python 2 和 3 的解决方案!
您可以使用 pathlib
. Unfortunately this is only available in the stdlib for Python 3.4. If you have an older version you'll have to install a copy from PyPI here。使用 pip
.
from pathlib import Path
p = Path(__file__).parents[1]
print(p)
# /absolute/path/to/two/levels/up
这使用 parents
序列提供对父目录的访问并选择第二个。
请注意,在这种情况下,p
将是某种形式的 Path
对象,具有自己的方法。如果您需要字符串形式的路径,则可以对它们调用 str
。
很简单:
这是你想要的:
import os.path as path
two_up = path.abspath(path.join(__file__ ,"../.."))
就我个人而言,我发现使用 os 模块是最简单的方法,如下所述。如果您只升一级,请将 ('../..') 替换为 ('..').
import os
os.chdir('../..')
--Check:
os.getcwd()
我还没有看到 2.7 的可行答案,它不需要安装额外的依赖项并且也从文件的目录开始。它作为单行解决方案并不好,但使用标准实用程序没有错。
import os
grandparent_dir = os.path.abspath( # Convert into absolute path string
os.path.join( # Current file's grandparent directory
os.path.join( # Current file's parent directory
os.path.dirname( # Current file's directory
os.path.abspath(__file__) # Current file path
),
os.pardir
),
os.pardir
)
)
print grandparent_dir
为了证明它有效,我在这里从 ~/Documents/notes
开始,只是为了显示当前目录不会影响结果。我将带有该脚本的文件 grandpa.py
放在名为 "scripts" 的文件夹中。它向上爬到 Documents 目录,然后爬到 Mac.
(testing)AlanSE-OSX:notes AlanSE$ echo ~/Documents/scripts/grandpa.py
/Users/alancoding/Documents/scripts/grandpa.py
(testing)AlanSE-OSX:notes AlanSE$ python2.7 ~/Documents/scripts/grandpa.py
/Users/alancoding
这是 the answer for the parent dir 的明显外推。使用通用解决方案比使用较少行的不太好的解决方案更好。
我发现以下内容在 2.7.x
中效果很好import os
two_up = os.path.normpath(os.path.join(__file__,'../'))
您可以将其用作通用解决方案:
import os
def getParentDir(path, level=1):
return os.path.normpath( os.path.join(path, *([".."] * level)) )
将目录提升 2 级:
import os.path as path
curr_dir=Path(os.path.dirname(os.path.abspath(__file__)))
two_dir_up_=os.fspath(Path(curr_dir.parent.parent).resolve())
我已经完成了以下操作以向上两个并向下钻取其他目录
default_config_dir=os.fspath(Path(curr_dir.parent.parent,
'data/config').resolve())
我本来打算添加这个只是为了愚蠢,但也是因为它向新手展示了别名函数 and/or 导入的潜在用途。
写完后,我认为这段代码比迄今为止的其他答案更具可读性(即掌握意图的时间更短),可读性(通常)是王道。
from os.path import dirname as up
two_up = up(up(__file__))
注意:只有当您的模块非常小或上下文相关时,您才想做这种事情。
更多跨平台实现将是:
import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
Windows 不支持使用 parent
。还需要添加 .resolve()
, 到:
Make the path absolute, resolving all symlinks on the way and also normalizing it (for example turning slashes into backslashes under Windows)
从任何目录执行时的最佳解决方案(对于 python >= 3.4)是:
from pathlib import Path
two_up = Path(__file__).resolve().parents[1]
假设您要访问 python 文件中名为 xzy 的两个文件夹。这对我和平台无关。
".././xyz"
(pathlib.Path('../../')).resolve()
100% 有效答案:
os.path.abspath(os.path.join(os.getcwd() ,"../.."))
已经有一个公认的答案,但对于两个级别,我认为链接方法可以说更具可读性:
pathlib.Path(__file__).parent.parent.resolve()
令人惊讶的是,似乎还没有人探索过这个不错的单行选项:
import os
two_up = os.path.normpath(__file__).rsplit(os.sep, maxsplit=2)[0]
rsplit
很有趣,因为 maxsplit
参数直接表示要向上移动多少个父文件夹,它总是 returns 结果只通过路径一次。
使用 Pathlib(在 Python 3.5 之后推荐,the/a 通用解决方案不仅适用于 file.py 文件,而且适用于 Jupyter(或其他类型的)笔记本和 Python shell 是:
p = Path.cwd().resolve().parents[1]
您只需将 (__file__)
替换为 cwd()
(当前工作目录)。
事实上,它甚至可以用于:
p = Path().resolve().parents[1]
(当然还有 .parent.parent
而不是 parents[1]
)