如何获取到特定子目录的路径?

车轮

我正在努力实现的目标

给定路径,我需要提取特定命名的子目录(如果存在)之前的路径部分 - 我们将调用此停止器以在此问题中轻松识别它。

需要注意的是,路径可能以塞子开始或结束

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

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'
# special case - should stop at first stopper location
path = 'path/to/to/my/file.ext'
stopper = 'to'
result = 'path'

到目前为止我所拥有的

我设计了两种获得答案的方法:

正则表达式

import re

# p = path; s = stopper
def regex_method(p,s):
  regex = r"(?:(?!(?:^|(?<=/))" + s + r").)+(?=/)"
  m = re.match(regex, p)
  if m:
    return m.group()
  return ''

这有效,但根据传递的塞子容易失败- 不适合在生产中使用。

import os

# p = path; s = stopper
def os_method(p,s):
  parts = os.path.dirname(p).split('/')
  return '/'.join(parts[:parts.index(s)])

这有效并且似乎比正则表达式更简洁,但对我来说,我需要拆分字符串,然后根据值的索引拆分列表,然后将其连接在一起似乎很奇怪。我觉得这可以简化或改进。


我的问题

  1. 是否有更惯用的方式来分割特定目录名称上的路径?
  2. 是否有使用列表推导式实现这一目标的简单方法?
极客先生

另一个看似更有效和更简单的方法是使用itertools.takewhile,它(来自文档)制作一个迭代器,只要谓词为真,它就会从可迭代对象中返回元素:

import os
from itertools import takewhile

def it_method(p, s):
  return '/'.join(takewhile(lambda d : d != s, p.split('/')))

测试:

print(it_method('some/path/to/my/file.ext', 'my'))
print(it_method('some/path/to/my/file.ext', 'to'))
print(it_method('some/path/to/my/file.ext', 'some'))
print(it_method('some/path/to/to/my/file.ext', 'to'))

输出:

some/path/to
some/path

some/path

所以在这种情况下,它会一直生成目录名称,直到stopper遇到。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用路径获取Java中的特定子目录

如何获取子目录中包含特定目录字符串的子目录中python文件的路径

bash:从给定子目录名称的当前目录获取路径

如何仅使用子目录的名称查找特定深子目录的路径?

查找不包含特定子目录的目录的名称

查找不包含特定子目录的目录的名称

如何为具有特定子目录访问权限的vsftpd设置虚拟用户?

如何使用特定子目录中的通配符提取文件

列出特定子目录中的文件

递归扩展和搜索特定子目录的模式

为.htaccess中的特定子目录创建例外

rsync特定子目录与模式匹配

删除随机创建的特定子目录中的文件

使用 Python 按名称复制特定子目录

C# 获取特定的子目录

如何从Java中的路径获取目录和子目录中的文件数?

VB.NET从路径获取目录和子目录

如何使用Python列出Azure云存储中特定子目录内的所有Blob?

如何在特定子目录上的最后x次提交上进行git补丁

如何使用终端将文件复制到具有相同名称的特定子目录?

制定子目录的模式规则

如何在Java中获取文件路径的中间子目录?

如何按顺序获取路径名,子目录名和文件列表?

从路径捕获子目录

如何从文件中获取子目录列表,然后在目录中创建这些子目录?

使用纯c ++(跨平台)获取特定路径中的所有目录/文件和子目录

.gitignore-跟踪文件和目录的特定子目录

如何从find命令中排除特定目录的子目录?

如何确保目录仅包含特定的子目录?