使用 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)
在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)