如何在 Python 中获取父目录?
- 2025-01-17 09:22:00
- admin 原创
- 22
问题描述:
有人能告诉我如何以跨平台方式在 Python 中获取路径的父目录吗?例如
C:Program Files ---> C:\n
和
C: ---> C:\n
如果目录没有父目录,则返回目录本身。这个问题看似简单,但我无法通过 Google 找到答案。
解决方案 1:
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
您希望父级的路径在哪里。
解决方案 2:
使用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)
。
解决方案 3:
使用 Pathlib(自python-3.4)
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
解决方案 4:
import os
p = os.path.abspath('..')
C:Program Files
--->C:\
C:
--->C:\
解决方案 5:
@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)) => '/'
解决方案 6:
os.path.split(os.path.abspath(mydir))[0]
解决方案 7:
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', '..'))
解决方案 8:
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 "------------------------------------------------------------"
解决方案 9:
>>> 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:WINDOWSsystem32'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'WINDOWS'
两个示例均在 Python 2.7 中尝试
解决方案 10:
假设我们有如下目录结构
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));
解决方案 11:
如果您只想要作为参数提供的文件的直接父文件夹的名称,而不是该文件的绝对路径:
os.path.split(os.path.dirname(currentDir))[1]
即currentDir
值为/home/user/path/to/myfile/file.ext
上述命令将返回:
myfile
解决方案 12:
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
parent_path = os.path.abspath(os.path.join(dir_path, os.pardir))
解决方案 13:
import os.path
os.path.abspath(os.pardir)
解决方案 14:
只需在 Tung 的答案中添加一些内容(rstrip('/')
如果您使用的是 Unix 系统,则需要使用更安全的方法)。
>>> 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"
以相同的方式行事。
解决方案 15:
print os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))
您可以使用它来获取 py 文件当前位置的父目录。
解决方案 16:
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())
解决方案 17:
获取父目录路径并创建新目录(名称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'))
解决方案 18:
os.path.abspath('D:Dir1Dir2..')
>>> 'D:Dir1'
因此..
有帮助
解决方案 19:
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))
解决方案 20:
上述答案对于上移一到两层目录来说都非常好,但如果需要遍历目录树的很多层(例如 5 或 10 层),它们可能会有点麻烦。这可以通过将 s 列表合并为 来简洁地完成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))
解决方案 21:
查找当前工作目录的父目录:
import pathlib
pathlib.Path().resolve().parent
解决方案 22:
sys.path
返回与项目相关的所有路径。
的第一个条目sys.path
是正在执行的文件的路径。如果正在执行的文件位于项目的根路径中,则 的第一个索引sys.path
将是项目的根路径。
如果正在执行的文件位于项目根路径的子目录中,那么它可以是从 1 到 sys.path 长度的任意条目。大多数情况下,它位于第二个条目中,索引为 1。无论如何,项目的根路径位于 中sys.path
。在我的情况下,它位于 C:Users/usernamePythonScrapper
索引 1 中。
import sys
for index, path in enumerate(sys.path):
print(f'{index:02}: {path}')
印刷:
00: C:Users/usernamePythonScrapperlibrary
01: C:Users/usernamePythonScrapper
02: C:Users/usernameAppDataLocalProgramsPythonPython312python312.zip
03: C:Users/usernameAppDataLocalProgramsPythonPython312DLLs
04: C:Users/usernameAppDataLocalProgramsPythonPython312Lib
05: C:Users/usernameAppDataLocalProgramsPythonPython312
06: C:Users/usernamePythonScrapperenv
07: C:Users/usernamePythonScrapperenvLibsite-packages
08: C:Users/usernameAppDataLocalProgramsPythonPython312Libsite-packages
09: C:Users/usernamePython*****************
10: C:Users/usernameAppDataLocalProgramsPythonPython312Libsite-packageswin32
11: C:Users/usernameAppDataLocalProgramsPythonPython312Libsite-packageswin32lib
12: C:Users/usernameAppDataLocalProgramsPythonPython312Libsite-packagesPythonwin
以下函数将返回项目的根路径,一旦您有了项目的根路径,您就可以添加之后文件夹的其余路径。
def abs_path(path: str = ''):
from sys import path as syspath
from os import sep
if len(path):
path = path.replace('/', sep)
if not path.startswith(sep):
path = sep + path
for _path in syspath[1:]:
if _path in syspath[0]:
return _path + path
return syspath[0] + path
return syspath[0] + path
print(__file__)
print(abs_path())
print(abs_path(r'config/urls.xml'))
印刷:
C:Users/usernamePythonScrapperlibraryunctions.py
C:Users/usernamePythonScrapper
C:Users/usernamePythonScrapperconfig/urls.xml
我喜欢的sys.path
是你可以通过附加模块路径来使用它来导入项目外部的模块。
from sys import path as syspath
from importlib import import_module
syspath.append(r'C:Users/usernamePythonexcepthook')
import_module('excepthook')
print(2 / 0)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)