Добавить несколько последовательностей из файла FASTA в список в Python - PullRequest
2 голосов
/ 04 марта 2012

Я пытаюсь организовать файл с несколькими последовательностями.При этом я пытаюсь добавить имена в список и добавить последовательности в отдельный список, параллельный списку имен.Я понял, как добавить имена в список, но не могу понять, как добавить последовательности, следующие за ним, в отдельные списки.Я попытался добавить строки последовательности в пустую строку, но он добавил все строки всех последовательностей в одну строку.

все имена начинаются с '>'

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

как добавить последовательности в список в виде набора строк?

файл ввода выглядит следующим образом

enter image description here

Ответы [ 3 ]

4 голосов
/ 04 марта 2012

Если вы работаете с файлами Python и fasta, вам может потребоваться установка BioPython. Он уже содержит эту функцию синтаксического анализа и многое другое.

Парсинг файла fasta будет таким простым:

from Bio import SeqIO
for record in SeqIO.parse('filename.fasta', 'fasta'):
    print record.id, record.seq
1 голос
/ 04 марта 2012

Вам нужно сбросить строку, когда вы нажмете на линии маркера, например:

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 = []
0 голосов
/ 29 июня 2017

Сначала я организовал это в словаре

# 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())
...