Python 将文件夹中的一张图片与多张图片配对
我想配对的文件夹中有一些图片,因此我可以以迭代方式将它们添加到幻灯片中。我想将以Python 将文件夹中的一张图片与多张图片配对,python,pandas,for-loop,if-statement,python-pptx,Python,Pandas,For Loop,If Statement,Python Pptx,我想配对的文件夹中有一些图片,因此我可以以迭代方式将它们添加到幻灯片中。我想将以mp结尾的图片与bp结尾的图片配对。一个警告是,有多个图片以bp和bp结尾,因此添加逻辑检查是可行的 假设文件夹中有一张照片 我想将1\u birds\u bp.png与其他图片配对,以1开头,以mp结尾 所以这对应该看起来像#预期的结果 ('D:\\test\\1_birds_bp.png', 'D:\\test\\1_eagle_mp.png') ('D:\\test\\1_birds_bp.png', 'D:
mp
结尾的图片与bp
结尾的图片配对。一个警告是,有多个图片以bp
和bp
结尾,因此添加逻辑检查是可行的
假设文件夹中有一张照片
我想将1\u birds\u 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')
对于爬行动物组
('D:\\test\\2_reptile_bp.png', 'D:\\test\\2_crocodile_mp.png')
('D:\\test\\2_reptile_bp.png', 'D:\\test\\2_snake_mp.png')
所以按照这个
我试过了
但我只能配对
('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.combines上的filter
进行自定义成对检查。您可以检查所有组合并选择匹配的组合:
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.compositions
上使用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)
我喜欢@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)
谢谢你的解决方案,效果很好。虽然它看起来像中等leetcode问题:)谢谢你的解决方案,它工作得很好。虽然它看起来像是中等水平的leetcode问题:)但可以使用os.listdir()
代替Path.iterdir()
。可以使用os.listdir()
代替Path.iterdir()
。