将一张图片与文件夹中的多张图片配对
pairing one picture to multiple pictures in folder
我想配对的文件夹中有一些图片,因此我可以通过迭代方式将它们添加到我的幻灯片中。我想将以 mp
结尾的图片与 bp
结尾的图片配对。需要注意的是,有多个以bp
和bp
结尾的图片,因此添加逻辑检查是可行的。
假设文件夹中有一张图片
我想将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)
我想配对的文件夹中有一些图片,因此我可以通过迭代方式将它们添加到我的幻灯片中。我想将以 mp
结尾的图片与 bp
结尾的图片配对。需要注意的是,有多个以bp
和bp
结尾的图片,因此添加逻辑检查是可行的。
假设文件夹中有一张图片
我想将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)