账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    如何对文件中的序列长度做过滤处理
    18
    0

    有一个文本文件,内容包括序列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)
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部