You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在规则中将路径名内的带前导零数字格式化为普通数字

解决方案

你的核心问题是未正确利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:50:30