在生成器中将ASCII字符转换为十进制
目标:解析一个由四行字符串组成的fastQ文件:
1) 第一行是ID行(seqID),可能还有注释(comm);
2) 第二行是DNA或蛋白质序列(seq);
3) 第三行是额外的一行;
4) 第四行是质量(qual)序列,每个字符对应第二行的蛋白质或DNA序列。
问题:我该如何使用ord()
将我的qual字符串中的所有字符转换呢?
我尝试过的:
fastQ中的qual行是一串字符串,我想遍历所有字符并用ord()
将它们转换为十进制格式。但是,当我运行一个生成器来输出seqID
、seq
、qual
和comm
时,似乎不能直接在定义这些新解析的变量时使用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