使用 Pathlib 通配绝对路径

Globbing Absolute Paths With Pathlib

在python3中,对未知(用户输入)文件路径进行操作时,我需要支持./r*/*.dat等通配符。计划是使用这样的东西(简化):

paths = []
for test in userinputs:
   paths.extend(pathlib.Path().glob(test))

这对相对路径非常有效;然而,当用户提供绝对路径(他们应该被允许这样做)时,代码失败:

NotImplementedError: Non-relative patterns are unsupported

如果它是一个 "simple" glob,比如 /usr/bin/*,我可以这样做:

test = pathlib.Path("/usr/bin/*")
sources.extend(test.parent.glob(test.name))

但是,就像我的第一个路径示例一样,我需要考虑路径部分 any 中的通配符,例如 /usr/b*/*.

有没有优雅的解决方案?我觉得我错过了一些明显的东西。

Path() 为其起始目录取一个参数。
为什么不测试输入以查看是否是绝对路径,然后将 Path() 初始化为根目录?类似于:

for test in userinputs:
    if test[0] == '/':
        paths.extend(pathlib.Path('/').glob(test[1:]))
    else:
        paths.extend(pathlib.Path().glob(test))

作为 Nullman 回答的补充:

pathlib.Path.is_absolute() 可能是一个不错的跨平台选项。

通过https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.is_absolute

你有什么理由不能使用 glob.glob

import glob
paths = []
for test in userinputs:
   # 'glob' returns strings relative to the glob expression,
   # so convert these into the format returned by Path.glob
   # (use iglob since the output is just fed to a generator)
   extras = (Path(p).absolute() for p in glob.iglob(test))
   paths.extend(extras)