parse pe fastq file use python

github看了业界大神li heng序列解析的脚本readfq,智商着急啊,没看懂,倒是新学了一个新功能,python生成器yield

readfq.py适用于fasta或者单端fastq文件,但是目前测序主要以双端数据为主,现学现卖,实现了一个paried-end数据解析器,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
# --*-- coding:utf-8 --*--

import os
import sys
import gzip

def parse_pe_fastq(fastq1,fastq2,phred=33):
from numpy import fromstring,byte
while True:
name1 = fastq1.readline().partition(' ')[0]
name2 = fastq2.readline().partition(' ')[0]
if not name1 or not name2:
break
read1, nothing1, qual1 = fq1.readline()[:-1], fq1.readline(), fq1.readline()[:-1]
read2, nothing2, qual2 = fq2.readline()[:-1], fq2.readline(), fq2.readline()[:-1]
qual1 = fromstring(qual1,dtype=byte)-phred
qual2 = fromstring(qual2,dtype=byte)-phred
assert name1 == name2, 'fastq1, fastq2 is not paired-end'
yield name1, read1, read2, qual1, qual2

if __name__ == '__main__':
fq1 = gzip.open(sys.argv[1],'r')
fq1 = gzip.open(sys.argv[2],'r')
for i in parse_pe_fastq(fq1, fq2):
name, seq1, seq2, qua1, qua2 = i
# filter, stat, split

通过while循环遍历双端文件,四行为一个单元进行数据读取,每四行作为一个完整单元返回(yeild),进行其他操作(# filter, stat, split), 一个操作结束后迭代器(parse_pe_fastq)继续解析测序数据,for循环中qua1作为一个numpy.ndarray对象,可进行其他一些q20统计、过滤等操作。

---------本文结束,感谢您的阅读---------