сопряжение одного изображения с несколькими изображениями в папке - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть несколько картинок в папке, которую я хочу связать, чтобы я мог добавлять их к своему слайду итеративным способом. Я хочу соединить картинки, оканчивающиеся на mp, и bp. Одно предостережение заключается в том, что существует несколько изображений, заканчивающихся bp и bp, так что добавление логической проверки было бы осуществимо.

Допустим, у нас есть изображения в папке

enter image description here

Я хочу связать 1_birds_bp.png с другими изображениями, начиная с 1 и заканчивая mp

, чтобы пара выглядела как # ожидаемый результат

('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')

как этого добиться?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Мне нравится подход @ 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)

1 голос
/ 20 февраля 2020

Вы можете проверить все комбинации и выбрать те, которые соответствуют:

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))]

Еще лучше, используйте filter на itertools.combinations для пользовательских парных проверок.

...