在生成器中将ASCII字符转换为十进制

0 投票
1 回答
1536 浏览
提问于 2025-05-01 02:05

目标:解析一个由四行字符串组成的fastQ文件:

1) 第一行是ID行(seqID),可能还有注释(comm);
2) 第二行是DNA或蛋白质序列(seq);
3) 第三行是额外的一行;
4) 第四行是质量(qual)序列,每个字符对应第二行的蛋白质或DNA序列。

问题:我该如何使用ord()将我的qual字符串中的所有字符转换呢?

我尝试过的: fastQ中的qual行是一串字符串,我想遍历所有字符并用ord()将它们转换为十进制格式。但是,当我运行一个生成器来输出seqIDseqqualcomm时,似乎不能直接在定义这些新解析的变量时使用qual = ord(block[3]),因为在尝试解析我的fastQ文件时出现了以下错误:

Traceback (most recent call last):
  File "fast_splitter_v1.py", line 91, in <module>
    for q in split:
  File "fast_splitter_v1.py", line 28, in read_fastq
    seqID, seq, qual = line1[0][1:], block[1], ord(block[3])
TypeError: ord() expected a character, but string of length 1550 found

我猜这样做是想把ord()应用到文件中所有的qual字符(总共有1550个)。这看起来是最好的方法,但现在我在寻找一个有效的解决方案。

这是我的代码:

def read_fastq(f):
    '''reads in fastaq file-like object in conventional 4-line NCBI format and 
    yields a tuple of lists comprising seqID (sequence ID/name/title), 
    seq (sequence), and qual (monomer read quality)'''
    ###CONVERT ALL QUAL SCORES TO INTEGER WITH ORD()
    lines = f.readlines()
    while len(lines) > 3:
        block = [lines.pop(0)[:-1] for z in range(4)]
        line1 = block[0].split(' ', 1)
        if len(line1) ==2:
            comm = line1[1]
        else:
            comm = ''
        seqID, seq, qual = line1[0][1:], block[1], block[3]
        yield seqID, seq, qual, comm

问题总结:

使用上面的代码,我该如何将qual中的所有内容从ASCII转换为十进制格式,并保持我的生成器函数?

示例FastQ:

`@SEQ_ID
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT
 +
 !''*((((***+))%%%++)(%%%%).1***-+*''))**55CCF>>>>>>CCCCCCC65`
暂无标签

1 个回答

0

我可能还是没完全理解这个问题,不过有什么能阻止你这样写最后一行呢:

yield seqID, seq, map(ord, qual), comm

或者

yield seqID, seq, [ord(c) for c in qual], comm

撰写回答