如何使用通配符获取路径名字符串并使用pathlib解决全局问题?

时间:2018-06-29 19:28:00

标签: python python-3.x glob pathlib

如果给我一个路径作为字符串,例如“〜/ pythoncode / *。py”,那么在pathlib中使用它的最佳方式是什么?

使用pathlib,有一种使用glob附加到路径的方法:

p = pathlib.Path('~/pythoncode/').expanduser().glob('*.py')

但是,例如,由于用户未展开,因此此操作不起作用:

p = pathlib.Path().glob('~/pythoncode/*.py')

这会产生异常,因为我没有为glob()提供任何参数:

p = pathlib.Path('~/pythoncode/*.py').expanduser().glob()

pathlib中有没有办法做到这一点,或者我必须首先解析字符串吗?

3 个答案:

答案 0 :(得分:5)

如果您从字符串"~/pythoncode/*.py"开始,并且想要扩展和遍历,则需要先拆分路径。幸运的是,pathlib提供了.name.parent来帮助you out

path = pathlib.Path("~/pythonpath/*.py")
pathlib.Path(path.parent).expanduser().glob(path.name)

请注意,此简单的解决方案仅在name包含glob时才起作用,而对路径其他部分的glob则不起作用,例如:~/python*/*.py。更为通用的解决方案,稍微复杂一些:

path = pathlib.Path("~/python*/*.py").expanduser()
parts = path.parts[1:] if path.is_absolute() else path.parts
pathlib.Path(path.root).glob(str(pathlib.Path("").joinpath(*parts)))

答案 1 :(得分:0)

我发现我真的想要内联扩展。这并不像我想象的那么容易。

无论如何,这就是我所拥有的。仅经过琐碎的测试,但请告诉我它在哪里落下来,我将对其进行编辑。

def expand_pathglobs(pathparts, basepaths=None):
    # Logic:
    # 0. Argue with a Path(str).parts and optional ['/start','/dirs'].
    # 1. for each basepath, expand out pathparts[0] into "expandedpaths"
    # 2. If there are no more pathparts, expandedpaths is the result.
    # 3. Otherwise, recurse with expandedpaths and the remaining pathparts.
    # eg: expand_pathglobs('/tmp/a*/b*')
    #   --> /tmp/a1/b1
    #   --> /tmp/a2/b2

    if isinstance(pathparts, str) or isinstance(pathparts, Path):
        pathparts = Path(pathparts).parts

    if basepaths == None:
        return expand_pathglobs(pathparts[1:], [Path(pathparts[0])])
    else:
        assert pathparts[0] != '/'

    expandedpaths = []
    for p in basepaths:
        assert isinstance(p, Path)
        globs = p.glob(pathparts[0])
        for g in globs:
            expandedpaths.append(g)

    if len(pathparts) > 1:
        return expand_pathglobs(pathparts[1:], expandedpaths)

    return expandedpaths

答案 2 :(得分:0)

pathlib.Path.glob不支持绝对(非相对)路径模式,但是glob.glob支持:

from glob import glob
from pathlib import Path

paths = [Path(p) for p in glob('/foo/*/bar')]

或与Path.expanduser有关:

paths = [Path(p) for p in glob(str(Path('~/.bash*').expanduser()))]