基于百分号命名占位符的字符串模板生成所有格式化排列文件名
生成所有参数组合的格式化文件名
这个需求其实很常见,核心就是要生成参数的笛卡尔积(所有可能的参数组合),再逐个套进你的百分号格式模板里就行。我给你整理了一个清晰的解决方案:
核心思路
- 提取参数字典里的键和对应的值列表
- 用
itertools.product生成所有参数的组合(笛卡尔积) - 将每个组合转换成匹配模板的字典格式
- 用模板的
%操作符格式化每个组合,得到最终文件名
完整代码示例
import itertools # 你的模板和参数 template = "image_%(uval)02d_%(vval)02d.%(frame)04d.tif" params = { "uval": [1,2], "vval": [1,2], "frame": [10,11] } # 提取参数的键和值列表 param_keys = list(params.keys()) param_value_lists = list(params.values()) # 生成所有文件名 filenames = [] for combo in itertools.product(*param_value_lists): # 把组合元组转成模板需要的字典 current_params = dict(zip(param_keys, combo)) # 格式化生成文件名 filenames.append(template % current_params) # 输出结果 print(filenames)
代码解释
itertools.product(*param_value_lists):这一步会生成所有参数的笛卡尔积,比如你的参数会生成(1,1,10)、(1,1,11)、(1,2,10)等共8种组合(2×2×2)dict(zip(param_keys, combo)):把每个组合元组转换成和模板占位符匹配的字典,比如(1,1,10)会变成{"uval":1, "vval":1, "frame":10}template % current_params:用Python原生的百分号格式化语法,把参数代入模板生成最终文件名
简化版本(列表推导式)
如果想让代码更简洁,可以用列表推导式一步完成:
import itertools template = "image_%(uval)02d_%(vval)02d.%(frame)04d.tif" params = { "uval": [1,2], "vval": [1,2], "frame": [10,11] } param_keys = list(params.keys()) filenames = [template % dict(zip(param_keys, combo)) for combo in itertools.product(*params.values())] print(filenames)
运行后会得到你需要的输出列表:
['image_01_01.0010.tif', 'image_01_01.0011.tif', 'image_01_02.0010.tif', 'image_01_02.0011.tif', 'image_02_01.0010.tif', 'image_02_01.0011.tif', 'image_02_02.0010.tif', 'image_02_02.0011.tif']
内容的提问来源于stack exchange,提问作者Julian Mann
相关产品推荐
相关产品推荐

