【问题标题】:How to get only the last part of a path in Python?如何在 Python 中只获取路径的最后一部分?
【发布时间】:2011-04-24 21:59:57
【问题描述】:

在 Python 中,假设我有这样的路径:

/folderA/folderB/folderC/folderD/

我怎样才能只得到folderD 部分?

【问题讨论】:

  • path.split('/')[len(path.split('/'))-1:][0]

标签: python path path-manipulation


【解决方案1】:

如果你使用原生的python包pathlib真的很简单。

>>> from pathlib import Path
>>> your_path = Path("/folderA/folderB/folderC/folderD/")
>>> your_path.stem
'folderD'

假设您有文件夹 D 中文件的路径。

>>> from pathlib import Path
>>> your_path = Path("/folderA/folderB/folderC/folderD/file.txt")
>>> your_path.stem
'file.txt'
>>> your_path.parent
'folderD'

【讨论】:

    【解决方案2】:

    在我当前的项目中,我经常将路径的后面部分传递给函数,因此使用Path 模块。为了以相反的顺序获得第 n 部分,我使用:

    from typing import Union
    from pathlib import Path
    
    def get_single_subpath_part(base_dir: Union[Path, str], n:int) -> str:
        if n ==0:
            return Path(base_dir).name
        for _ in range(n):
            base_dir = Path(base_dir).parent
        return getattr(base_dir, "name")
    
    path= "/folderA/folderB/folderC/folderD/"
    
    # for getting the last part:
    print(get_single_subpath_part(path, 0))
    # yields "folderD"
    
    # for the second last
    print(get_single_subpath_part(path, 1))
    #yields "folderC"
    

    此外,要以包含剩余路径的路径的相反顺序传递第 n 部分,我使用:

    from typing import Union
    from pathlib import Path
    
    def get_n_last_subparts_path(base_dir: Union[Path, str], n:int) -> Path:
        return Path(*Path(base_dir).parts[-n-1:])
    
    path= "/folderA/folderB/folderC/folderD/"
    
    # for getting the last part:
    print(get_n_last_subparts_path(path, 0))
    # yields a `Path` object of "folderD"
    
    # for second last and last part together 
    print(get_n_last_subparts_path(path, 1))
    # yields a `Path` object of "folderc/folderD"
    

    请注意,此函数返回一个Pathobject,它可以很容易地转换为字符串(例如str(path)

    【讨论】:

      【解决方案3】:

      我正在寻找一种解决方案来获取文件所在的最后一个文件夹名称,我只使用了两次split,以获得正确的部分。这不是问题,但谷歌将我转移到这里。

      pathname = "/folderA/folderB/folderC/folderD/filename.py"
      head, tail = os.path.split(os.path.split(pathname)[0])
      print(head + "   "  + tail)
      

      【讨论】:

      • 您也可以使用os.path.basename(os.path.dirname(pathname)),这将在您的示例中给出folderD。查看@Mike Miterer 的回答
      【解决方案4】:

      我喜欢 Path 的 parts 方法:

      grandparent_directory, parent_directory, filename = Path(export_filename).parts[-3:]
      log.info(f'{t: <30}: {num_rows: >7} Rows exported to {grandparent_directory}/{parent_directory}/{filename}')
      

      【讨论】:

      • 我最喜欢的,更干净的:'/'.join(Path(export_filename).parts[-3:])
      【解决方案5】:

      在 python 3 中,您可以使用pathlib 模块(例如pathlib.PurePath):

      >>> import pathlib
      
      >>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/')
      >>> path.name
      'folderD'
      

      如果您想要文件所在的最后一个文件夹名称:

      >>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
      >>> path.parent.name
      'folderD'
      

      【讨论】:

      • 好吧,只是指出PurePath vs Path,第一个提供“纯计算操作”(无 I/O),而另一个(“具体路径”)继承自首先,还提供 I/O 操作。
      【解决方案6】:

      这是我的方法:

      >>> import os
      >>> print os.path.basename(
              os.path.dirname('/folderA/folderB/folderC/folderD/test.py'))
      folderD
      >>> print os.path.basename(
              os.path.dirname('/folderA/folderB/folderC/folderD/'))
      folderD
      >>> print os.path.basename(
              os.path.dirname('/folderA/folderB/folderC/folderD'))
      folderC
      

      【讨论】:

      • 与上述方法相比,您的方法解决了什么不同/更好?
      • @user1767754:虽然很简洁,但这确实说明了一个在没有文件名的情况下适用于我们的解决方案,同时也显示了如果最终目录没有尾随 / 的陷阱(并且不需要纯路径)
      【解决方案7】:

      你可以的

      >>> import os
      >>> os.path.basename('/folderA/folderB/folderC/folderD')
      

      UPDATE1:这种方法在你给它 /folderA/folderB/folderC/folderD/xx.py 的情况下有效。这将 xx.py 作为基本名称。我猜这不是你想要的。所以你可以这样做 -

      >>> import os
      >>> path = "/folderA/folderB/folderC/folderD"
      >>> if os.path.isdir(path):
              dirname = os.path.basename(path)
      

      UPDATE2:正如 lars 指出的那样,进行更改以适应尾随的“/”。

      >>> from os.path import normpath, basename
      >>> basename(normpath('/folderA/folderB/folderC/folderD/'))
      'folderD'
      

      【讨论】:

      • 在 Python-think 中,os.path.basename(".../") 正确地产生 ''。是的,我也觉得那不是最理想的。但是,下面的 ...basename(...normpath... 解决方案是规范的。
      • @lars 是的!刚刚看到在这种情况下,先规范化路径,然后再将其提供给 basename。 os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
      • UPDATE2 是迄今为止我发现的最好的方法。
      【解决方案8】:

      使用os.path.normpath,然后使用os.path.basename

      >>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
      'folderD'
      

      第一个去掉任何尾部斜杠,第二个给你路径的最后一部分。仅使用 basename 会给出最后一个斜杠之后的所有内容,在本例中为 ''

      【讨论】:

      • 我最初认为rstrip('/') 会更简单,但很快意识到我必须使用rstrip(os.path.sep),所以显然使用normpath 是合理的。
      • 这似乎不适用于 Windows 长路径,例如 '\\\\?\\D:\\A\\B\\C\\''\\\\?\\UNC\\svr\\B\\C\\'(返回空字符串)This 解决方案适用于所有情况。
      • @jinnlao 的answer 现在好多了。
      【解决方案9】:
      str = "/folderA/folderB/folderC/folderD/"
      print str.split("/")[-2]
      

      【讨论】:

      • 他想要folderD。不是folderC
      • 它给出“folderD”,因为尾部斜杠使列表中的最后一项成为“”
      • 说真的,使用os.path 模块。
      【解决方案10】:
      path = "/folderA/folderB/folderC/folderD/"
      last = path.split('/').pop()
      

      【讨论】:

      • 说真的,使用os.path 模块。
      • 人们在发帖前会尝试他们的答案吗?
      猜你喜欢
      • 1970-01-01
      • 2011-09-20
      • 2021-10-09
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多