如何在 Python 中获取父目录?

2025-01-17 09:22:00
admin
原创
22
摘要:问题描述:有人能告诉我如何以跨平台方式在 Python 中获取路径的父目录吗?例如C:Program Files ---> C:\n和C: ---> C:\n如果目录没有父目录,则返回目录本身。这个问题看似简单,但我无法通过 Google 找到答案。解决方案 1:Python 3.4使用pathl...

问题描述:

有人能告诉我如何以跨平台方式在 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.pardiros.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/usernamePythonScrapperlibraryunctions.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)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1056  
  在项目管理的各个阶段中,CDCP(概念设计到商业化生产)阶段尤为关键,它不仅是产品从概念到市场落地的桥梁,也是创新与风险控制的博弈场。创新是推动项目成功的核心动力,而风险控制则是确保项目稳健前行的基石。如何在CDCP阶段平衡这两者,是每个项目管理者和团队必须面对的挑战。创新往往伴随着不确定性,而风险控制则强调对不确定性...
华为IPD流程   1  
  华为的集成产品开发(IPD)流程是业界公认的高效产品开发方法论,旨在通过结构化、系统化的方式提升产品开发的效率和质量。然而,随着市场需求的快速变化,传统的IPD流程也面临着如何快速响应市场、缩短开发周期、提高灵活性的挑战。为了应对这些挑战,华为在IPD流程的基础上进行了持续的优化和创新,使其能够更好地适应快速变化的市场...
华为IPD流程   0  
  华为作为全球领先的通信技术公司,其成功不仅依赖于技术创新,更得益于其科学的管理体系。其中,集成产品开发(IPD)模式是华为产品开发流程的核心,而技术评审与质量保障机制则是IPD中确保产品成功的关键环节。通过系统化的技术评审和严格的质量保障措施,华为能够在产品开发的每个阶段有效识别并解决潜在问题,从而减少返工、提高效率,...
IPD测试流程   0  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为导向、跨职能团队协作的产品开发管理模式。它强调在产品开发的早期阶段就整合市场、研发、制造、供应链等多个部门的资源和能力,从而缩短开发周期、降低成本并提高产品质量。IPD的成功实施依赖于多个关键因素,这些因素不仅决定了开...
华为IPD流程   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用