在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ 如何對文件中的序列長度做過濾處理

如何對文件中的序列長度做過濾處理

有一個文本文件,內(nèi)容包括序列id和其序列內(nèi)容,以>開頭的行表示id,其后面的幾行表示序列內(nèi)容,請教該如何過濾掉長度小于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

現(xiàn)在文件很大所以打算讀一條序列處理一條序列,如果全部讀入字典的話太占內(nèi)存了,我自己寫了個,但是感覺有點啰嗦,請教該如何處理,謝謝!
附上自己代碼吧。。

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)
回答
編輯回答
尛憇藌

做生信的吧? 何必重復(fù)造輪子

  1. Biopython
  2. cutadapt
from Bio import SeqIO

input_seq_iterator = SeqIO.parse("test.fasta", "fasta")
long_seq_iterator = (record for record in input_seq_iterator if len(record.seq) > 1)

SeqIO.write(long_seq_iterator, "long_seqs.fasta", "fasta")
  • 或者自己造個輪子
def fasta_parser(handle):
    # 跳過開頭可能的注釋, 空格之類內(nèi)容
    while True:
        line = handle.readline()
        if not line:
            return  # 處理文件過早結(jié)束或者為空的情形
        if line.startswith(">"):
            break

    while True:
        if not line.startswith(">"):
            raise ValueError(
                "Tags in Fasta files should start with '>' character")
        tag = line.strip()
        seqs = ""
        line = handle.readline()
        # 處理換行序列
        while True:
            if not line:
                break
            if line.startswith(">"):
                break
            seqs += line.strip()  # 拼接
            line = handle.readline()

        # 去除序列中可能的空格及\r
        yield tag, seqs.replace(" ", "").replace("\r", "")

        if not line:
            return  # 文件讀完, 停止迭代


with open("test.txt", "r") as fh:
    for i in fasta_parser(fh):
        if len(i[1]) > 10:
            print('\n'.join(i))
2018年9月20日 21:52
編輯回答
來守候
def read_custom_file(in_file):
    with open(in_file, 'r') as f:
        seq = ''
        tag = False
        while True:
            pos_previous = f.tell()
            line = f.readline()
            if not line:
                yield seq
                break
            else:
                if line.startswith('>') and tag:
                    if len('seq') < 10:
                        # add your custom code here
                        pass
                    else:
                        yield seq
                    seq = ''
                    f.seek(pos_previous)
                    tag = False
                elif line.startswith('>'):
                    tag = True
                    seq += line
                else:
                    seq += line

for line in read_custom_file('sample.txt'):
    print(line)
2017年1月26日 08:00
編輯回答
疚幼
for l in f.readlines():
    if len(l) > 1:
        # do...
        
2017年1月20日 17:21