2013-08-07 2 views
0

У меня есть Fasta файл с несколькими последовательностями с заголовками, которые выглядят так:Извлечения последовательности из файла Fasta по идентификационному номеру в заголовке

>1016BSA34080.1 
MTHSVRIITVTVNFLQHRFFIDYMSEIGLLDGEIEQMVSALQEQVHIVARARTLPEMKNLERDTHVIVKT 
LKKQLTAFHSEVKKIADSTQRSRYEGKHQTYEAKVKDLEKELRTQIDPPPKSVSEKHMEDLMGEGGPDGS 
GFKTTDQVLRAGIRIQNDA 

>1038BSA81955.1 
MQQQQARRRMEEPTAAAATASSTTSFAAQPLLSRSVAPQAASSPQASARLAESAGFRSAAVFGSAQAAVG 
GRGRGGFGAPPGRGGFGAPPAAGFGAAPAFGAPPTLQAFSAAPAPGGFGAPPAPQGFGAPRAAGFGAPPA 
PQAFSAVAPASSTAIPLDVTTYLGDTFGSAPTRGPP 

4-значный номер в начале заголовка является уникальным идентификатором для последовательности.

Не могли бы вы помочь мне написать скрипт python для извлечения последовательностей с помощью 4-значного идентификатора (в текстовом файле с одним идентификатором на строку)?

Я попытался модифицировать этот скрипт (я нашел на этом сайте: Extract sequences from a FASTA file based on entries in a separate file), чтобы удовлетворить мои цели (напрасно):

f2 = open('accessionids.txt','r') 
f1 = open('fasta.txt','r') 
f3 = open('fasta_parsed.txt','w') 

AI_DICT = {} 
for line in f2: 
    AI_DICT[line[:-1]] = 1 

skip = 0 
for line in f1: 
    if line[0] == '>': 
     _splitline = line.split('|') 
     accessorIDWithArrow = _splitline[0] 
     accessorID = accessorIDWithArrow[1:-1] 
     # print accessorID 
     if accessorID in AI_DICT: 
      f3.write(line) 
      skip = 0 
     else: 
      skip = 1 
    else: 
     if not skip: 
      f3.write(line) 

f1.close() 
f2.close() 
f3.close() 

Я новичок в Python, любая помощь будет принята с благодарностью! Спасибо -Divya

+0

Просто чтобы убедиться, что я правильно понять: вы хотите, чтобы извлечь полную последовательность, приведенную 4-значный идентификатор ли? – Barranka

ответ

1

accessionids.txt содержит только четырехзначные коды?

Если это так, измените accessorID на:

accessorID = accessorIDWithArrow[1:5] 

Некоторые способы сделать это более вещий являются:

Используйте набор вместо словаря для AI_DICT, используйте strip(), а не нарезка для удаления символа новой строки и использовать выражение генератора для создания набора

AI_SET = set((line.strip() for line in f2)) 

использования True и False, а тх n 0 и 1 для skip.

Я бы повторить основной цикл, таким образом:

in_accession_ids = False 
for line in f1: 
    if line[0] == '>': 
     _splitline = line.split('|') 
     accessorIDWithArrow = _splitline[0] 
     accessorID = accessorIDWithArrow[1:5] 
     # print accessorID 
     in_accession_ids = accessorID in AI_SET 
    if in_accession_ids: 
     f3.write(line) 

Я думаю, что логика немного более очевидным, таким образом. Кроме того, начиная с skip = 0 в оригинале, или in_accession_ids=True в шахте, означало бы, что вы напечатали все до поиска первого заголовка последовательности. Это может быть желание, которое вы хотите, это может быть не так, - предположил я, не в моем переписывании.

Возможно, вам захочется заглянуть в коллекцию Biopython - это слишком много для этой конкретной задачи, но довольно неплохо. Множество инструментов для чтения файлов FASTA и связанных с ними форматов, среди прочего.

http://biopython.org/wiki/Biopython

Смежные вопросы