Python如何使用glob函数获取fastq文件名并拆分SRRID与测序端编号
问题分析
你之前的写法存在两个核心问题:
- glob函数接收的是带通配符的字符串,不支持
{id}/{int}这类占位符语法,也无法直接返回分组解析后的结果 - glob.glob返回的是匹配到的文件名列表,无法直接解包为两个变量srr、fr
实现方案
方案1:glob + 字符串分割(最简单通用)
直接匹配所有符合格式的fastq文件,再通过字符串拆分提取你需要的两个字段:
import glob srr_list = [] fr_list = [] # 通配符匹配所有SRR开头、下划线后带数字的fastq文件 for fastq_file in glob.glob("SRR*_*.fastq"): # 先去掉后缀.fastq,再按下划线拆分 srr_id, fr_num = fastq_file[:-6].split("_") srr_list.append(srr_id) fr_list.append(int(fr_num))
如果需要按SRR分组存储配对的方向信息,也可以整理为字典结构:
srr_reads = {} for fastq_file in glob.glob("SRR*_*.fastq"): srr_id, fr_num = fastq_file[:-6].split("_") if srr_id not in srr_reads: srr_reads[srr_id] = [] srr_reads[srr_id].append(int(fr_num))
方案2:Snakemake原生适配方案
你在编写Snakemake工作流,更推荐直接用Snakemake的内置逻辑处理样本匹配,不需要手动拆分文件名:
import glob # 先提取所有唯一的样本SRR号(用read1的文件匹配避免重复) SAMPLES = [f.split("_")[0] for f in glob.glob("*_1.fastq")] # 定义read方向 READS = [1, 2] # 全流程入口规则,批量匹配所有样本的输出文件 rule all: input: expand("analysis/{sample}_R{read}.qc.fastq", sample=SAMPLES, read=READS) # 示例fastq质控规则,自动匹配输入文件的wildcards rule fastq_qc: input: "{sample}_{read}.fastq" output: "analysis/{sample}_R{read}.qc.fastq" threads: 2 shell: "fastp -i {input} -o {output}"
方案3:正则匹配(适配复杂文件名场景)
如果你的后续文件名可能存在多个下划线等复杂情况,可以用正则表达式精准匹配提取字段:
import glob import re # 正则规则:分组匹配SRR+数字、下划线后的数字、.fastq后缀 file_pattern = re.compile(r"(SRR\d+)_(\d+)\.fastq") srr_list = [] fr_list = [] for fastq_file in glob.glob("*.fastq"): match_res = file_pattern.fullmatch(fastq_file) if match_res: srr_list.append(match_res.group(1)) fr_list.append(int(match_res.group(2)))
内容的提问来源于stack exchange,提问作者Arun Alexander
相关产品推荐
相关产品推荐

