Как взять строку пути с подстановочными знаками и разрешить глоб с помощью pathlib? - PullRequest
0 голосов
/ 29 июня 2018

Если мне дается путь в виде строки, такой как "~ / pythoncode / *. Py", каков наилучший способ добавить его в pathlib?

Используя pathlib, есть способ добавления к пути с помощью глобуса:

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

но это, например, не работает, потому что пользователь не развернут:

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

и это генерирует исключение, потому что я не предоставляю аргументов для glob():

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

Есть ли способ сделать это в pathlib, или я должен сначала проанализировать строку?

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Я обнаружил, что действительно хотел встроенное расширение. Это было не так просто, как я думал.

Во всяком случае, вот что у меня есть. Только тривиально проверено, но дайте мне знать, где оно падает, и я отредактирую его.

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
0 голосов
/ 30 мая 2019

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()))]
0 голосов
/ 29 июня 2018

Если вы начинаете со строки "~/pythoncode/*.py" и хотите развернуться и добавить глобус, сначала вам нужно разделить путь. К счастью, pathlib предоставляет .name и .parent, чтобы помочь вам :

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

Обратите внимание, что это простое решение будет работать только в том случае, если только name содержит глоб, и не будет работать с глобусами в других частях пути, например: ~/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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...