Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python snakemake:如何为新创建的文件使用glob_通配符?_Python_Snakemake - Fatal编程技术网

Python snakemake:如何为新创建的文件使用glob_通配符?

Python snakemake:如何为新创建的文件使用glob_通配符?,python,snakemake,Python,Snakemake,问题是: 我有一个很大的工作流,它在某个点上为每个{sample}创建任意数量的文件,例如test1.txt,test2.txt,等等 然后我需要使用这些文件进行进一步处理。然后,下一个规则的输入文件是{sample}/test1.txt,{sample}/test2.txt,等等。因此test1,test2等成为通配符 数据结构是: ---data ---sample1 ---test1.txt ---test2.txt ---test3.txt ---sample2

问题是:

我有一个很大的工作流,它在某个点上为每个
{sample}
创建任意数量的文件,例如
test1.txt
test2.txt
,等等

然后我需要使用这些文件进行进一步处理。然后,下一个规则的输入文件是
{sample}/test1.txt
{sample}/test2.txt
,等等。因此
test1
test2
等成为通配符

数据结构是:

---data
 ---sample1
   ---test1.txt
   ---test2.txt
   ---test3.txt
 ---sample2
   ---test1.txt
   ---test2.txt
Snakefile
我正在为如何使用snakemake解决这些问题而苦苦挣扎。我已经研究了函数
glob_通配符
,但不知道如何使用它

凭直觉,我会这样做:

samples = ['sample1', 'sample2']

rule append_hello:
  input:
    glob_wildcards('data/{sample}/{id}.txt')
  output:
    'data/{sample}/{id}_2.txt'
  shell:
    " echo {input} 'hello' >> {output} "
我有两个问题:

  • 如何在蛇形障碍中处理这个问题
  • 您将如何构建一个
    规则all
    ,以运行此操作
  • 如有任何进一步阅读的意见或提示,将不胜感激

    编辑 我认为这与通配符约束有关。当我跑步时:

    assemblies = []
    for filename in glob_wildcards(os.path.join("data/{sample}", "{i}.txt")):
        assemblies.append(filename)
    print(assemblies)
    
    我得到两个对应索引匹配的列表:

    [['sample1', 'sample1', 'sample1', 'sample2', 'sample2'], ['test1', 'test2', 'test3', 'test5', 'test4']]
    

    现在我基本上只需要告诉snakemake使用相应的通配符值。

    您的问题是,在执行任何规则之前,
    glob\u通配符
    只计算一次,因此系统不知道该规则将生成多少文件

    你需要的是一份工作。此功能允许您在某个点停止蛇行并重新评估DAG

    samples=[“sample1”、“sample2”]
    规则所有:
    输入:
    展开(“data/{sample}/processed.txt”,sample=samples)
    检查点生成\u任意:
    输出:
    目录(“数据/{sample}/arbitral”)
    运行:
    如果wildcards.sample==“sample1”:
    n=3
    其他:
    n=2
    shell(“mkdir{output}”)
    对于范围(1,n+1)内的id:
    shell(f“echo'{{id}}'>数据/{wildcards.sample}/arbitral/{id}.txt”)
    def聚合_输入(通配符):
    checkpoints.generate_arbitral.get(sample=wildcards.sample)
    ids=glob_通配符(f“data/{wildcards.sample}/arbitral/{id}}.txt”).id
    返回expand(f“data/{wildcards.sample}/arbitral/{id}}.txt”,id=ids)
    规则:您好:
    输入:
    总输入
    输出:
    “数据/{sample}/processed.txt”
    外壳:
    “echo{input}'你好'>{output}”
    
    您的问题是,在执行任何规则之前,
    全局通配符
    只计算一次,因此系统不知道该规则将生成多少文件

    你需要的是一份工作。此功能允许您在某个点停止蛇行并重新评估DAG

    samples=[“sample1”、“sample2”]
    规则所有:
    输入:
    展开(“data/{sample}/processed.txt”,sample=samples)
    检查点生成\u任意:
    输出:
    目录(“数据/{sample}/arbitral”)
    运行:
    如果wildcards.sample==“sample1”:
    n=3
    其他:
    n=2
    shell(“mkdir{output}”)
    对于范围(1,n+1)内的id:
    shell(f“echo'{{id}}'>数据/{wildcards.sample}/arbitral/{id}.txt”)
    def聚合_输入(通配符):
    checkpoints.generate_arbitral.get(sample=wildcards.sample)
    ids=glob_通配符(f“data/{wildcards.sample}/arbitral/{id}}.txt”).id
    返回expand(f“data/{wildcards.sample}/arbitral/{id}}.txt”,id=ids)
    规则:您好:
    输入:
    总输入
    输出:
    “数据/{sample}/processed.txt”
    外壳:
    “echo{input}'你好'>{output}”
    
    谢谢您抽出时间。我不认为这是我想要的。在检查点中,文件数是硬编码的(
    n=3
    n=2
    )。我正在寻找一种方法,将规则append_hello应用于每个目录中的每个文件,而不必事先知道每个
    示例
    生成了多少文件。这取决于您如何生成文件。我刚刚提供了一个示例,其中相同的检查点显然会为不同的样本生成不同数量的文件。这不是一个要求:您的检查点可能由一个
    shell
    部分组成,脚本在其中工作(并且没有任何内容是硬编码的或可以很容易预测的)。我仍然感到困惑:所需的输出都是单独的文件,并附加了一个“hello”。你能扩展一下聚合输入的功能吗?这个函数做什么?我想我的问题与通配符约束有关。我想使用
    sample1/test1.txt
    等作为通配符,形式为
    {sample}/{id}.txt
    ,但不使用
    {sample}
    {id}
    的乘积。我需要告诉snakemake将
    sample1
    与ids=[test1,test2,test3]和
    sample2
    与ids=[test1,test2]结合起来。如果您只需要输出
    “hello”
    ,只需这样做:
    f“echo'hello'>数据/{wildcards.sample}/arbitral/{id}.txt”
    。通配符约束是将文件分离到不同目录时应避免的另一个问题。谢谢您的时间。我不认为这是我想要的。在检查点中,文件数是硬编码的(
    n=3
    n=2
    )。我正在寻找一种方法,将规则append_hello应用于每个目录中的每个文件,而不必事先知道每个
    示例
    生成了多少文件。这取决于您如何生成文件。我刚刚提供了一个示例,其中相同的检查点显然会为不同的样本生成不同数量的文件。这不是一个要求:您的检查点可能由一个
    shell
    部分组成,脚本在其中工作(并且没有任何内容是硬编码的或可以很容易预测的)。我仍然感到困惑:所需的输出都是单独的文件,并附加了一个“hello”。你能扩展一下聚合输入的功能吗?这个函数做什么?我想我的问题与通配符约束有关。我想使用
    sampl