2

我正在尝试用多个序列组织文件。在这样做时,我试图将名称添加到列表中,并将序列添加到与名称列表平行的单独列表中。我想出了如何将名称添加到列表中,但我不知道如何将其后面的序列添加到单独的列表中。我尝试将序列行附加到一个空字符串中,但它将所有序列的所有行附加到一个字符串中。

所有名称都以“>”开头

def Name_Organizer(FASTA,output):

    import os
    import re

    in_file=open(FASTA,'r')
    dir,file=os.path.split(FASTA)
    temp = os.path.join(dir,output)
    out_file=open(temp,'w')

    data=''
    name_list=[]

    for line in in_file:

        line=line.strip()
        for i in line:
            if i=='>':
                name_list.append(line)
                break
            else:
                line=line.upper()
        if all([k==k.upper() for k in line]):
            data=data+line

    print data

如何将序列作为一组字符串添加到列表中?

输入文件看起来像这样

在此处输入图像描述

4

3 回答 3

4

如果您正在使用 Python 和 fasta 文件,您可能需要考虑安装BioPython。它已经包含了这个解析功能,还有更多。

解析 fasta 文件就像这样简单:

from Bio import SeqIO
for record in SeqIO.parse('filename.fasta', 'fasta'):
    print record.id, record.seq
于 2012-03-04T18:55:28.760 回答
1

当您点击标记线时,您需要重置字符串,如下所示:

def Name_Organizer(FASTA,output):

    import os
    import re

    in_file=open(FASTA,'r')
    dir,file=os.path.split(FASTA)
    temp = os.path.join(dir,output)
    out_file=open(temp,'w')

    data=''
    name_list=[]
    seq_list=[]

    for line in in_file:

        line=line.strip()
        for i in line:
            if i=='>':
                name_list.append(line)
                if data:
                    seq_list.append(data)
                    data=''
                break
            else:
                line=line.upper()
        if all([k==k.upper() for k in line]):
            data=data+line

    print seq_list

当然,使用字符串连接而不是不断追加可能会更快(取决于文件的大小):

data = []

# ...

data.append(line) # repeatedly

# ...

seq_list.append(''.join(data)) # each time you get to a new marker line
data = []
于 2012-03-04T18:49:27.217 回答
0

我先把它整理在字典里

# remove white spaces from the lines
lines = [x.strip() for x in open(sys.argv[1]).readlines()]
fasta = {}
for line in lines:
    if not line:
        continue
    # create the sequence name in the dict and a variable
    if line.startswith('>'):
        sname = line
        if line not in fasta:
            fasta[line] = ''
        continue
    # add the sequence to the last sequence name variable
    fasta[sname] += line
# just to facilitate the input for my function
lst = list(fasta.values())
于 2017-06-29T03:19:42.940 回答