如何使用通配符获取路径名字符串并使用pathlib解析glob?

Ome*_*man 5 python glob python-3.x pathlib

如果我给一个字符串的路径,例如"〜/ pythoncode/*.py",那么将它全局化的最佳方法是什么pathlib?

使用pathlib,有一种方法可以使用glob追加到路径:

p = pathlib.Path('~/pythoncode/').expanduser().glob('*.py')
Run Code Online (Sandbox Code Playgroud)

但是,例如,这不起作用,因为用户未展开:

p = pathlib.Path().glob('~/pythoncode/*.py')
Run Code Online (Sandbox Code Playgroud)

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

p = pathlib.Path('~/pythoncode/*.py').expanduser().glob()
Run Code Online (Sandbox Code Playgroud)

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

Mes*_*ssa 6

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

from glob import glob
from pathlib import Path

paths = [Path(p) for p in glob('/foo/*/bar')]
Run Code Online (Sandbox Code Playgroud)

或与Path.expanduser:

paths = [Path(p) for p in glob(str(Path('~/.bash*').expanduser()))]
Run Code Online (Sandbox Code Playgroud)


Mat*_*ory 5

如果您从字符串开始"~/pythoncode/*.py"并且想要展开和glob,则需要首先拆分路径.幸运的是,pathlib提供.name并.parent帮助您:

path = pathlib.Path("~/pythonpath/*.py")
pathlib.Path(path.parent).expanduser().glob(path.name)
Run Code Online (Sandbox Code Playgroud)

请注意,这个简单的解决方案仅在name包含glob 时才起作用,它不适用于路径其他部分的globs,如:~/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)))
Run Code Online (Sandbox Code Playgroud)