有一个文本文件,内容包括序列id
和其序列内容,以>
开头的行表示id
,其后面的几行表示序列内容,请教该如何过滤掉长度小于l
的序列。部分文件如下:
>NNH52_c0_seq1
ATGAGCATTGCCTTACCTCCTCTAAATCATACATAATATTGCAGGCTCTCCCTTTTTACC
ACCTCGCCAATTACCTTTACAAAGAGGATTAAGAATTTAATCCTGAGCAACCACCTAGTT
TTATTAATGCACATTGACATAGCAGTATCTTTTTGCTCATAGAACAAGTTCAGATATTAT
TTGGCCTTTGATAA
>NNH262_c0_seq1
AATTCTCACGCCTCCAGTGAACCTTATAGTATTAATGACAGAGTTACCACCTCCGACAAA
GGAACGACGTTTCAAACCCTGCGTCTCTCTACCTTGTCAGGCGAGTAGGCGGAACGACTC
TTGGACATCCCACCTGTGATCACCG
>NNH774_c0_seq1
GGTAGCCCCGCCGTGGATGCGCCGCCATCTCTTCGTCTGTGTCTCCTTCCCTTCTCTCTC
TCTCTCTCCCCACTTGAAACTGGGTTGGCCCAGAAATCTTCCGTTCCGCTGAAAAGCTCC
TCTCTCTCTCTTCTCTCTCTCTCTCTTTCTCT
AGGCAG
>NNH4124_c0_seq1
ATGATATCCTTCGCCTACAACCATCAGTACCAGCAGATCGCCGCTGCAGGAGGGTACCCA
CTG
现在文件很大所以打算读一条序列处理一条序列,如果全部读入字典的话太占内存了,我自己写了个,但是感觉有点啰嗦,请教该如何处理,谢谢!
附上自己代码吧。。
def rmShort(in_file, out_file, length):
cunt = defaultdict(str)
with open(in_file) as f_in, open(out_file, 'w') as f_out:
for line in f_in:
if line.startswith('>'):
try: # 在读取后一条序列的时候处理前一条序列,所以刚刚读取第一行的时候会报错
seq = cunt.pop(id_)
if len(seq) > length:
f_out.write(id_)
f_out.write(seq)
except:
pass
finally:
id_ = line
else:
cunt[id_] += line
for seq_id, seq in cunt.items(): # 对于最后一行,无法读取其后一行时处理它,故拿出来专门处理
if len(seq) > length:
f_out.write(seq_id)
f_out.write(seq)