将列表中的每个项目添加到FASTA文件中特定行的末尾

时间:2015-04-28 21:13:13

标签: python list header element fasta

我在下面的评论中解决了这个问题。

基本上我要做的是将字符串列表的每个元素添加到不同文件中特定行的末尾。

很难解释,但基本上我想解析一个FASTA文件,每次到达一个标题(line.startswith('>'))我希望它用这个标题替换部分标题我已经制作的列表中的元素。

例如:

File1中:

"> seq1不需要这里

AATATTATA

ATATATATA

> seq2不需要的东西

GTGTGTGTG

GTGTGTGTG

> seq3更多我不想要的东西

ACACACACAC

ACACACACAC"

我希望它保持"> seq#"但是用下面列表中的下一个项目替换所有内容:

表: mylist =" [' things1','',' things3',' things4','&#39 ; ' things6',' things7']"

结果(修改过的文件1):

"> seq1 things1

AATATTATA

ATATATATA

> seq2#由于mylist [1] =''

GTGTGTGTG

GTGTGTGTG

> seq3 things3

ACACACACAC

ACACACACAC

如您所见,我希望它甚至可以添加列表中的空白项目。

所以再次,我希望它解析这个FASTA文件,每次它到达一个标题(有成千上万),我希望它替换第一个单词后的所有内容与单独列表中的下一个项目我有制成。

3 个答案:

答案 0 :(得分:1)

你有什么工作,但有一些不必要的线,所以我编辑下来使用少几行。另外,一个重要的注意事项是您不要关闭文件句柄。这可能会导致错误,特别是在写入文件时,无论哪种方式都是不好的做法。代码:

AppServiceProvider

这并不完美,但它可以清理一些事情。我可能会转而使用pop()将注释数据与序列ID相关联,除非您确定文件每次都以相同的顺序。

答案 1 :(得分:1)

在Fasta中有一个很棒的库用于Fasta和其他DNA文件解析。它在生物信息学中非常有用。您还可以根据需要操作任何数据。 以下是从the library website提取的简单示例:

from Bio import SeqIO
for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"):
    print(seq_record.id)
    print(repr(seq_record.seq))
    print(len(seq_record))

你应该在屏幕上看到这样的东西:

gi|2765658|emb|Z78533.1|CIZ78533
Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', SingleLetterAlphabet())
740
...
gi|2765564|emb|Z78439.1|PBZ78439
Seq('CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC', SingleLetterAlphabet())
592

答案 2 :(得分:0)

*********** EDIT *********

我在任何人都可以帮忙之前解决了这个问题这是我的代码,任何人都可以告诉我,如果我有任何不良做法?有没有办法在不将所有内容写入新文件的情况下执行此操作?好像需要很长时间/大量记忆。

#!/usr/bin/python
# Script takes unedited FASTA file, removed seq length and
# other header info, adds annotation after sequence name
# run as: $ python addanno.py testanno.out testseq.fasta out.txt

import sys

# gets list of annotations
def get_annos(infile):
    f = open(infile)
    list2 = []
    for line in f:
        columns = line.strip().split('\t')
        list2.append(columns[5])
    return list2

# replaces extra info on each header with correct annotation
def add_annos(infile1, infile2, outfile):
    mylist = get_annos(infile1) # contains list of annos
    f2 = open(infile2, 'r')
    output = open(out, 'w')
    for line in f2:
        if line.startswith('>'):
            l = line.partition(" ")
            list3 = list(l)
            del list3[1:]
            list3.append(' ')
            list3.append(mylist.pop(0))
            final = ''.join(list3)
            line = line.replace(line, final)
            output.write(line)
            output.write('\n')
       else:
            output.write(line)

anno = sys.argv[1]
seq = sys.argv[2]
out = sys.argv[3]

add_annos(anno, seq, out)
get_annos(anno)