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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:54:04