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

时间:2014-11-01 23:52:13

标签: python string ascii generator bioinformatics

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

1)同一行上的ID行(seqID)和可能的注释(comm);
2)DNA或蛋白质序列(seq);
3)额外的线
4)质量(质量)序列,其中每个字符对应于蛋白质或DNA seq(第2行)

问题:如何使用ord() ??

转换每个限定字符串的所有字符

我尝试过: fastQ中的qual行是一行字符串,我想遍历所有字符串并使用ord()将它们转换为十进制格式。但是,当我运行一个产生seqID seq qualcomm的生成器时,我似乎无法在我定义的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

问题摘要:

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

示例FastQ:

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

1 个答案:

答案 0 :(得分:0)

我可能仍然不理解这个问题,但有什么可以阻止你做如下的最后一行:

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

OR

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