如何使用pathlib使用两个模式?

时间:2018-01-10 05:51:08

标签: python pathlib

我想找到两种类型的文件,其中包含两个不同的扩展程序:.jl.jsonlines。我用

from pathlib import Path
p1 = Path("/path/to/dir").joinpath().glob("*.jl")
p2 = Path("/path/to/dir").joinpath().glob("*.jsonlines")

但我希望p1p2作为一个变量而不是两个。我应该首先合并p1p2吗?还有其他方法可以整合glob的模式吗?

5 个答案:

答案 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)