为 snakemake 管道按文件名模式过滤目录中的文件

问题描述 投票:0回答:0

我有一个目录,其中包含具有以下模式的文件:..json。一些 ID 重复,日期不同。我想过滤每个 ID 具有最近日期的文件。

如何在 snakemake 中实现这个过滤步骤?

我已经有一个返回过滤文件列表的 python 函数。这是 snakemake 文件的一个最小示例:


import os
import re

dir_path = "path/to/dir/"
out_dir = "path/to/result_dir"

def get_most_recent_files(wildcards):

  dir = dir_path
  file_pattern = re.compile(r"([A-Za-z0-9]+)\.(\d{4}-\d{2}-\d{2}).json$")
  id_files = {}

  for filename in os.listdir(dir): 
    match = file_pattern.match(filename)
    if match: 
        id, date = match.groups()
        id_files.setdefault(id, []).append((filename, date))

  most_recent_files = {}
  for id, files in id_files.items(): 
    files.sort(key=lambda x: x[1], reverse=True)
    most_recent_files[id] = files[0][0]
  
  return [dir + file for file in most_recent_files.values()]


rule all: 
    input: 
        out_dir + "{ID}_parsed.csv"

rule parse_jsons: 
    input: 
        get_most_recent_files
    output: 
        out_dir + "{ID}_parsed.csv"
    script: 
        "parser.py"

但是像这样我得到错误:

Wildcards in input files cannot be determined from output files: 'ID'

所以我不确定我应该在哪里提供通配符“PID”。

我尝试了使用 glob_wildcards 和扩展的不同方法,但没有任何效果。

python snakemake
© www.soinside.com 2019 - 2024. All rights reserved.