我想找到两种类型的文件,其中包含两个不同的扩展程序:.jl
和.jsonlines
。我用
from pathlib import Path
p1 = Path("/path/to/dir").joinpath().glob("*.jl")
p2 = Path("/path/to/dir").joinpath().glob("*.jsonlines")
但我希望p1
和p2
作为一个变量而不是两个。我应该首先合并p1
和p2
吗?还有其他方法可以整合glob的模式吗?
答案 0 :(得分:1)
受@ aditi答案的启发,我提出了这个问题:
from pathlib import Path
from itertools import chain
exts = ["*.jl", "*.jsonlines"]
mainpath = "/path/to/dir"
P = []
for i in exts:
p = Path(mainpath).joinpath().glob(i)
P = chain(P, p)
print(list(P))
答案 1 :(得分:1)
from pathlib import Path
exts = [".jl", ".jsonlines"]
mainpath = "/path/to/dir"
# Same directory
files = [p for p in Path(mainpath).iterdir() if p.suffix in exts]
# Recursive
files = [p for p in Path(mainpath).rglob('*') if p.suffix in exts]
# 'files' will be a generator of Path objects, to unpack into strings:
list(files)
答案 2 :(得分:1)
如果可以安装软件包,请签出wcmatch
。它可以修补Python PathLib,以便您可以一次性运行多个匹配项:
from wcmatch.pathlib import Path
paths = Path('path/to/dir').glob(['*.jl', '*.jsonlines'])
答案 3 :(得分:1)
根据您的应用程序,建议的解决方案可能效率低下,因为它必须多次遍历目录中的所有文件(每个扩展名/模式一个)。
在您的示例中,您只匹配一个文件夹中的扩展名,一个简单的解决方案可能是:
from pathlib import Path
folder = Path("/path/to/dir")
extensions = {".jl", ".jsonlines"}
files = [file for file in folder.iterdir() if file.suffix in extensions]
如果你经常使用它可以在一个函数中上交。
但是,如果您希望能够匹配 glob 模式而不是扩展名,则应该使用 match()
方法:
from pathlib import Path
folder = Path("/path/to/dir")
patterns = ("*.jl", "*.jsonlines")
files = [f for f in folder.iterdir() if any(f.match(p) for p in patterns)]
最后一个既方便又高效。您可以通过将最常见的模式放在模式列表的开头来提高效率,因为 any
是一个短路运算符。
答案 4 :(得分:0)
试试这个:
from os.path import join
from glob import glob
files = []
for ext in ('*.jl', '*.jsonlines'):
files.extend(glob(join("path/to/dir", ext)))
print(files)