设置路径名称中的数字格式



我有一个规则,使用用一系列数字命名的文件,这些数字来自010203。。。直到文件名中的12,我需要将它们格式化为123。。。12用于下一步的分析。

我确信有一种方法可以用f-string或.format()来实现这一点,但我不确定如何在一个规则中实现,在该规则中,我还用列表指定了数字序列。

我怎么去那里?

一个最小的例子(不起作用(:

numbers = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]
starting_folder = "project/temp"
rule rename_files:
input: f"{starting_folder}/file.{{numbers}}.ext"
output: f"{starting_folder}/file.{{{numbers}}:01d}_new.ext"
shell: "ln -s {input} {output}"

例如,我想获得project/temp/file.1_new.ext作为输出文件路径。

解决这个问题的方法是使用输入函数,并预先格式化预期输出

numbers = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]
# a dict mapping expected numbers to their old version, assuming they are unique 
expected_numbers = {n.lstrip("0") : n for n in numbers} 
def expected_file(wildcards):
"""Takes the expected output number and returns the input number"""
old_number = expected_numbers[wildcards.number]
return f"project/temp/file.{old_number}.ext"
rule rename_files:
input: expected_file  # using the input function to get the expected file
output: "project/temp/file.{number}_new.ext"
shell: "ln -s {input} {output}"
rule target: 
input: expand("project/temp/file.{number}_new.ext", number=expected_numbers)

这比苏尔坦·奥拉兹巴耶夫的回答有点冗长,但可能更明确一点?它还允许避免在输入和输出或规则中转义方括号,这在更大的项目中可能很难调试。

它还使用了两个对其他人有用的蛇形功能:

  • 扩展函数:https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#the-展开函数
  • 输入函数的使用:https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#the-展开函数

缺少的步骤有:

  • 使用.lstrip指定目标文件的所需格式
  • 请求所有目标文件(没有0s的文件(
  • 在需要两个版本的规则中,从减少的整数(没有前导零(开始,并将前导零添加到源(原始(文件中
numbers = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]
starting_folder = "project/temp"
rule all:
input: [f"{starting_folder}/file.{n.lstrip('0')}_new.ext" for n in numbers]
rule rename_files:
input: f"{starting_folder}/file.{{n:02}}.ext"
output: f"{starting_folder}/file.{{n}}_new.ext"
shell: "ln -s {input} {output}"

相关内容

  • 没有找到相关文章

最新更新