Python 如何获取到特定子目录的路径? 我想要达到的目标

Python 如何获取到特定子目录的路径? 我想要达到的目标,python,python-3.x,os.path,Python,Python 3.x,Os.path,给定一个路径,我需要提取路径中位于特定命名子目录(如果存在)之前的部分-我们将调用此塞子,以便在这个问题中轻松识别它 应注意的是,路径可能以止动块开始或结束 输入/输出的一些示例对: path = 'some/path/to/my/file.ext' # ends with stopper stopper = 'my' result = 'some/path/to' # begins with stopper stopper = 'some' result = '' # stopper i

给定一个路径,我需要提取路径中位于特定命名子目录(如果存在)之前的部分-我们将调用此塞子,以便在这个问题中轻松识别它

应注意的是,路径可能以止动块开始或结束

输入/输出的一些示例对:

path = 'some/path/to/my/file.ext'

# ends with stopper
stopper = 'my'
result = 'some/path/to'

# begins with stopper
stopper = 'some'
result = ''

# stopper in middle
stopper = 'to'
result = 'some/path'

到目前为止我所拥有的 我设计了两种获得答案的方法:

正则表达式 这是可行的,似乎比正则表达式更简洁,但我觉得奇怪的是,我需要拆分字符串,然后根据值的索引将列表合并在一起。我觉得这可以简化或改进


我的问题
  • 有没有一种更惯用的方法来拆分特定目录名上的路径
  • 有没有一种简单的方法可以使用列表理解来实现这一点

  • 另一种似乎更有效、更简单的方法是使用,它(从文档中)使迭代器在谓词为true时从iterable返回元素:

    import os
    from itertools import takewhile
    
    def it_method(p, s):
      return '/'.join(takewhile(lambda d : d != s, p.split('/')))
    
    测试:

    输出:

    some/path/to
    some/path
    
    some/path
    
    因此,在这种情况下,它会一直生成目录名,直到遇到
    stopper

    谓词也可以缩短为
    s.\uu_____
    ,而不是使用
    lambda
    函数:

    def it_method(p,s):
      return '/'.join(takewhile(s.__ne__, p.split('/')))
    

    另一种似乎更有效、更简单的方法是使用,它(从文档中)使迭代器在谓词为true时从iterable返回元素:

    import os
    from itertools import takewhile
    
    def it_method(p, s):
      return '/'.join(takewhile(lambda d : d != s, p.split('/')))
    
    测试:

    输出:

    some/path/to
    some/path
    
    some/path
    
    因此,在这种情况下,它会一直生成目录名,直到遇到
    stopper

    谓词也可以缩短为
    s.\uu_____
    ,而不是使用
    lambda
    函数:

    def it_method(p,s):
      return '/'.join(takewhile(s.__ne__, p.split('/')))
    
    您可以在生成器上使用模块和
    next
    ,如下所示:

    from pathlib import Path
    
    # p = path; s = stopper
    def get_path(p,s):
        return next((parent for parent in Path(p).parents if not any(x in str(parent) for x in (f'/{s}/', f'{s}/', f'/{s}')) and str(parent) != s), '')
    
    path = 'some/path/to/my/file.ext'
    # ends with stopper
    stopper = 'to' 
    
    print(get_path(path, stopper))
    # some/path
    
    您可以在生成器上使用模块和
    next
    ,如下所示:

    from pathlib import Path
    
    # p = path; s = stopper
    def get_path(p,s):
        return next((parent for parent in Path(p).parents if not any(x in str(parent) for x in (f'/{s}/', f'{s}/', f'/{s}')) and str(parent) != s), '')
    
    path = 'some/path/to/my/file.ext'
    # ends with stopper
    stopper = 'to' 
    
    print(get_path(path, stopper))
    # some/path
    

    我建议使用
    pathlib

    def split_路径(路径,塞子):
    parts=path.parts
    idx=next((idx表示idx,如果part==stopper,则枚举(parts)中的part))
    结果=路径(*部分[:idx])
    返回结果
    
    以您的例子:

    path=path('some/path/to/my/file.ext'

    stopper='my'
    分割路径(路径、止动器)
    
    输出:
    PosixPath('some/path/to')

    stopper='some'
    分割路径(路径、止动器)
    
    输出:
    PosixPath('.')

    stopper='to'
    分割路径(路径、止动器)
    

    输出:
    PosixPath('some/path')
    我建议使用
    pathlib

    def split_路径(路径,塞子):
    parts=path.parts
    idx=next((idx表示idx,如果part==stopper,则枚举(parts)中的part))
    结果=路径(*部分[:idx])
    返回结果
    
    以您的例子:

    path=path('some/path/to/my/file.ext'

    stopper='my'
    分割路径(路径、止动器)
    
    输出:
    PosixPath('some/path/to')

    stopper='some'
    分割路径(路径、止动器)
    
    输出:
    PosixPath('.')

    stopper='to'
    分割路径(路径、止动器)
    

    输出:
    PosixPath('some/path')

    @ctwheels,您现在可以试试吗?注意:使用
    stopper
    -
    'some'
    ,这将返回一个点。@ctwheels,您现在可以试试吗?注意:使用
    stopper
    -
    'some'
    ,将返回一个点。