2012-03-04 3 views
2

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

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

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

ответ

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 = [] 
+0

это работает! я просто запутался в строке «если данные:» Как имя строки может быть выражением if? –

+0

В Python пустая строка является ложным значением, а непустая строка - истинное значение. Таким образом, 'если данные:' равнозначно, если данные не пусты " – Amber

+0

@ draconisthe0ry, Янтарь. Я считаю, что я должен упомянуть, что есть что-то странное в отношении итерации каждого персонажа каждой строки. Разве это не нужно? Я что-то упускаю? – senderle

3

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

Синтаксический файл Fasta будет так же просто, как это:

from Bio import SeqIO 
for record in SeqIO.parse('filename.fasta', 'fasta'): 
    print record.id, record.seq 
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())