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'
,将返回一个点。