pathlib.Path().glob() 和多个文件扩展名

Dmi*_*kov 14 python path

我需要指定多个文件扩展名,例如 pathlib.Path(temp_folder).glob('*.xls', '*.txt'):

我该怎么做?

https://docs.python.org/dev/library/pathlib.html#pathlib.Path.glob

mat*_*ent 12

如果你需要使用 pathlib.Path.glob()

from pathlib import Path
def get_files(extensions):
    all_files = []
    for ext in extensions:
        all_files.extend(Path('.').glob(ext))
    return all_files

files = get_files(('*.txt', '*.py', '*.cfg'))
Run Code Online (Sandbox Code Playgroud)


小智 7

有点晚了,有一些单行建议,不需要编写自定义函数,也不需要使用循环并在 Linux 上工作:

pathlib.Path.glob() 采用括号中的交错符号。对于“.txt”和“.xls”后缀的情况,可以这样写

files = pathlib.Path('temp_dir').glob('*.[tx][xl][ts]')
Run Code Online (Sandbox Code Playgroud)

如果您还需要搜索“.xlsx”,只需在最后一个右括号后附加通配符“*”。

files = pathlib.Path('temp_dir').glob('*.[tx][xl][ts]*')
Run Code Online (Sandbox Code Playgroud)

要记住的一点是,末尾的通配符不仅会捕获“x”,还会捕获最后一个“t”或“s”之后的任何尾随字符。

在搜索模式前加上“**/”将执行前面答案中讨论的递归搜索。

  • 单行解决方案的一个警告是,这还将匹配扩展名为 .txs、.tlt、.tls、.xxs 和 .xlt 的文件。 (14认同)
  • 这似乎对我来说在 OS X、Python 3.10 上不起作用,没有匹配项 (5认同)

小智 6

您也可以使用语法**pathlib它允许你递归收集嵌套的路径。

from pathlib import Path
import re


BASE_DIR = Path('.')
EXTENSIONS = {'.xls', '.txt'}

for path in BASE_DIR.glob(r'**/*'):
    if path.suffix in EXTENSIONS:
        print(path)
Run Code Online (Sandbox Code Playgroud)

如果您想在搜索中表达更多逻辑,您还可以使用正则表达式,如下所示:

pattern_sample = re.compile(r'/(([^/]+/)+)(S(\d+)_\d+).(tif|JPG)')
Run Code Online (Sandbox Code Playgroud)

此模式将查找S327_008(_flipped)?.tif在我的情况下匹配的所有图像(tif 和 JPG)。具体来说,它将收集样本 ID 和文件名。

收集到集合中可以防止存储重复项,我发现如果您插入更多逻辑并想要忽略文件的不同版本(_flipped

matched_images = set()

for item in BASE_DIR.glob(r'**/*'):
    match = re.match(pattern=pattern_sample, string=str(item))
    if match:
        # retrieve the groups of interest
        filename, sample_id = match.group(3, 4)
        matched_images.add((filename, int(sample_id)))
Run Code Online (Sandbox Code Playgroud)