如何在python中获得unix风格通配符的插入?



我有一个比较复杂的文件结构。使用glob.glob('base_directory/*/*/*<some_pattern>.dat'),我确实得到了所有相关文件名的列表,但我需要在不同级别上使用相关子目录的名称,所以我真正想要的只是通配符的插入。

最后,我想为文件结构的每个子级别的插入构建一个字典的字典。但首先,我只需要一个函数/包,它只返回模式匹配的插入。知道去哪里找吗?

假设我正确阅读了问题,您可以使用pathlib.Path.glob获得所有匹配路径:

pushd /tmp
mkdir -p a/b/c/d/1.dat
mkdir -p a/b/e/g/2.dat
mkdir -p a/b/c/d/e/g.dat
>>> from pathlib import Path
>>> files = list(Path("/tmp").glob("**/*.dat"))
>>> print(files)
[PosixPath('/tmp/a/b/e/g/2.dat'), PosixPath('/tmp/a/b/c/d/1.dat'), PosixPath('/tmp/a/b/c/d/e/g.dat')]

请参阅glob上的pathlib文档了解更多细节。还有.rglob(),有效地节省了输入**

提取部分显然你想要在正则表达式中像组(())这样的东西。虽然在pathlib.glob中没有支持,但我知道,对于您给出的特定示例,很容易得到它:

import re
def analyse_path(p: Path) -> tuple[str]:
_*, a, b, c, fn = p.parts
match_ = re.search("param1_([0-9]+)-param2_(.+).dat", fn)
if not match_:
raise ValueError(f"unable to extract data from {fn}") 
return (a, b, c, *match_.groups())
useful_data = [analyse_path(p) for p in Path("/tmp").glob("*/*/*/*.dat")]

这里的想法是使用全局变量来缩小范围,并对文件名本身进行正则表达式搜索。但是如果你需要做比glob中的"*"更复杂的事情,我会用正则表达式做整个事情,可能会对Path(basedir).glob("**")的结果进行操作。如果您有非常大的dirs或许多不相关的文件,那么您可能会遇到瓶颈,但是在尝试任何比大glob更不清晰的东西之前进行配置。

最新更新