将一张图片与文件夹中的多张图片配对

pairing one picture to multiple pictures in folder

我想配对的文件夹中有一些图片,因此我可以通过迭代方式将它们添加到我的幻灯片中。我想将以 mp 结尾的图片与 bp 结尾的图片配对。需要注意的是,有多个以bpbp结尾的图片,因此添加逻辑检查是可行的。

假设文件夹中有一张图片

我想将1_birds_bp.png与其他以1开头并以mp结尾的图片配对

这样这对应该看起来像#expected result

('D:\test\1_birds_bp.png', 'D:\test\1_eagle_mp.png')
('D:\test\1_birds_bp.png', 'D:\test\1_hawk_mp.png')
('D:\test\1_birds_bp.png', 'D:\test\1_owl_mp.png')

reptile

('D:\test\2_reptile_bp.png', 'D:\test\2_crocodile_mp.png')
('D:\test\2_reptile_bp.png', 'D:\test\2_snake_mp.png')

所以按照这个 我试过了

def image_pairs(folder):
    bp, mp = [], []

    for image_path in glob.glob(folder + '/*.png'):
        if "bp" in image_path:
            bp.append(image_path)

        elif "mp" in image_path:
            mp.append(image_path)
    for pair in zip(bp, mp):
        print(pair)
        #yield pair

但我可以配对唯一的

('D:\test\1_birds_bp.png', 'D:\test\1_eagle_mp.png')
('D:\test\2_reptile_bp.png', 'D:\test\1_hawk_mp.png')

如何实现?

您可以检查所有组合并选择匹配的组合:

from itertools import combinations
from pathlib import Path
files = Path(folder).glob('*.png')
list_of_pairs = [(a, b) for a, b in combinations(files, 2)
                 if (a.name.startswith(b.name[0]) and (('mp' in a.name and 'bp' in b.name) or ('bp' in a.name and 'mp' in b.name))]

更好的是,在 itertools.combinations 上使用 filter 进行自定义成对检查。

我喜欢@xletmjm 的方法,尽管 pathlib 仅在 Python >= 3.4 中可用。

这是一种替代方法,适用于您目前使用的方法。

import glob

class Path(object):
    def __init__(self, path):
        self._path = path

    @property
    def stem(self):
        """The "base" part of the filename, without the extension."""
        return ".".join(self.filename.split(".")[:-1])

    @property
    def filename(self):
        return self._path.split("/")[-1]

    @property
    def filename_prefix(self):
        return self.stem.split("_")[0]

    @property
    def filename_suffix(self):
        return self.stem.split("_")[-1]

    @property
    def path(self):
        return self._path


def iter_bp_paths(paths):
    """Generate each Path object in `paths` with filename having "_bp" suffix."""
    return (p for p in paths if p.filename_suffix == "bp")


def iter_mp_paths(paths, prefix):
    """Generate each Path object in `paths` with `prefix` and "mp" suffix."""
    return (
        p for p in paths if p.filename_prefix == prefix and p.filename_suffix == "mp"
    )


if __name__ == "__main__":
    paths = [Path(path) for path in glob.glob("/Users/you/tmp/*.png")]
    for bp_path in iter_bp_paths(paths):
        for mp_path in iter_mp_paths(paths, bp_path.filename_prefix):
            print(bp_path.path, mp_path.path)