如何使用pathlib glob 两种模式?

Gmo*_*naq 8 python pathlib

我想找到具有两种不同扩展名的两种类型的文件:.jl.jsonlines. 我用

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

但我想要p1p2作为一个变量而不是两个。我应该合并p1,并p2在首位?还有其他方法可以连接 glob 的模式吗?

les*_*lie 13

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)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,除非使用 [生成器理解](https://peps.python.org/pep-0289/) 语法(括号而不是列表理解中的方括号),否则您不会获得生成器,因此:` files = (p for p in Path(mainpath).iterdir() if p.suffix in exts)` (3认同)

Alb*_*dez 7

这对我有用:

\n
for f in path.glob("*.[jpeg jpg png]*"):\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n

作为参考fnmatch

\n
\n

[seq] 匹配 seq 中的任意字符

\n
\n

在Path.glob中:

\n
\n

模式与 fnmatch 相同,但添加了 \xe2\x80\x9c**\xe2\x80\x9d,这意味着 \xe2\x80\x9c 这个目录和所有子目录,递归地\xe2\x80\x9d。

\n
\n

编辑:

\n

更好的方法是这样的:

\n
*.[jpJP][npNP][egEG]*\n
Run Code Online (Sandbox Code Playgroud)\n

我不知道正确的 POSIX 兼容方法。前面的方法将匹配“.py”之类的文件,因为括号以任何顺序匹配任何字母。

\n

这种方式应该匹配“jpeg”、“JPEG”、“jpg”、“JPG”、“png”和“PNG”。它还匹配“jpegxyz”等格式,因为末尾有“*”,但括号序列使得更难选择其他文件扩展名。

\n


Adi*_*iti 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)
Run Code Online (Sandbox Code Playgroud)

  • 有没有使用“pathlib”的“Path”的解决方案? (2认同)