如何在规则中将路径名内的带前导零数字格式化为普通数字
解决方案
你的核心问题是未正确利用Snakemake的expand()函数批量生成输入输出路径,同时缺少对带前导零数字的转换处理。以下是修正后的完整代码:
numbers = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"] starting_folder = "project/temp" rule rename_files: input: expand("{folder}/file.{num}.ext", folder=starting_folder, num=numbers) output: expand("{folder}/file.{clean_num}_new.ext", folder=starting_folder, clean_num=[str(int(num)) for num in numbers]) shell: "ln -s {input} {output}"
关键说明:
- 用
expand()批量生成路径:
Snakemake的expand()函数专门用于批量生成文件路径列表,它会遍历给定变量值生成所有对应路径,替代了你原代码中直接嵌套变量的错误写法。 - 数字去前导零处理:
生成输出路径时,通过列表推导式[str(int(num)) for num in numbers],将带前导零的字符串数字转为整数(自动去除前导零)后再转回字符串,得到["1", "2", ..., "12"]的干净数字列表。 - 输入输出自动映射:
expand()生成的输入、输出列表是一一对应的,Snakemake会自动将每个输入文件匹配到对应输出文件,逐个执行shell命令。
更简洁的写法(用lambda表达式处理数字):
你也可以直接在expand()参数中用lambda函数处理数字,省去单独生成干净数字列表的步骤:
numbers = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"] starting_folder = "project/temp" rule rename_files: input: expand("{folder}/file.{num}.ext", folder=starting_folder, num=numbers) output: expand("{folder}/file.{clean_num}_new.ext", folder=starting_folder, clean_num=lambda num: str(int(num)), num=numbers) shell: "ln -s {input} {output}"
运行后即可得到你期望的project/temp/file.1_new.ext这类输出文件。
内容的提问来源于stack exchange,提问作者Giulio Centorame
相关产品推荐
相关产品推荐

