2015-04-13 3 views
1

Я хочу сделать три вещи:Найти строку и его расположение в файле

1) Print out the ID for each sequence 
2) Find a particular motif in a sequence, print it out if it exists 
3) Print out the index location for the motif in the sequence 

Sequence.fasta пример файла:

>sp|Q12955|ANK3_HUMAN Ankyrin-3 OS=Homo sapiens GN=ANK3 PE=1 SV=3 
MAHAASQLKKNRDLEINAEEEPEKKRKHRKRSRDRKKKSDANASYLRAARAGHLEKALDY 
IKNGVDINICNQNGLNALHLASKEGHVEVVSELLQREANVDAATKKGNTALHIASLAGQA 

>sp|Q16659|MK06_HUMAN Mitogen-activated protein kinase 6 OS=Homo sapiens GN=MAPK6 PE=1 SV=1 
MAEKFESLMNIHGFDLGSRYMDLKPLGCGGNGLVFSAVDNDCDKRVAIKKIVLTDPQSVK 
HALREIKIIRRLDHDNIVKVFEILGPSGSQLTDDVGSLTELNSVYIVQEYMETDLANVLE 
QGPLLEEHARLFMYQLLRGLKYIHSANVLHRDLKPANLFINTEDLVLKIGDFGLARIMDP 

>sp|Q7Z7A1|CNTRL_HUMAN Centriolin OS=Homo sapiens GN=CNTRL PE=1 SV=2 
MKKGSQQKIFKHLQQPSSSHSPIPSSMSNMRSRSLSPLIGSETLPFHSGGQWCEQVEIAD 
ENNMLLDYQDHKGADSHAGVRYITEALIKKLTKQDNLALIKSLNLSLSKDGGKKFKYIEN 
LEKCVKLEVLNLSYNLIGKIEKLDKLLKLRELNLSYNKISKIEGIENMCNLQKLNLAGNE 

В этом файле я хочу найти следующие мотивы (может быть несколько же мотивы в сл.) в качестве примера:

MAH..S 
KK..D 
FES.MN 
K..QQ 

Таким образом, вывод должен быть:

ID = Q12955 
Motif = MAH..S 
Location =[0] to [4] 
Motif = KK..D 
Location = [8] to [12] 

ID = Q16659 
Motif = FES.MN 
Location = [4] to [9] 

ID = Q7Z7A1 
Motif = K..QQ 
Location = [1] to [6] 
Location = [10] to [14] 

код до сих пор:

Чтобы найти ID:

f=open('pr_seq.fasta','r') 

for idLine in f: 
    if '>' in idLine: 
     lineSplit = idLine.split('|') 
     ID = lineSplit[1] 
     print ID 

Чтобы найти мотивы в последовательности:

f=open('pr_seq.fasta','r') 
pr=[] 

for motLine in f: 
    if motLine[0]=='>': 
     pr=motLine.split("\n")[1] 

    else: 
     try: 
      pr+=motLine.strip() 
     except: 
      pr+=motLine.strip() 

    print ("PROTEIN SEQUENCE")  
    print 
    print (pr) 
    print 

Чтобы найти местоположение индекса для мотивов:

motif= ['N.E.K..N', 'N.Y....E', 'S...D.PL', 'S..SS','S.S..S', 'F.FP'] 
indices=len(pr) 
index=0 

for a in motif: 
    if re.findall(a,pr): 
     print a 
     mi = pr.index(a) 
+0

Думаю, было бы полезно, если бы вы упростили свой пример. Разрывы строк рассматриваются как пробелы? В противном случае вы можете просто использовать grep. В противном случае я бы выполнил реализацию алгоритма Кнута-Морриса-Прата. –

+0

В файле sequence.fasta нет пробелов или разрывов строк. –

+0

Итак, почему вы добавили разрывы строк в свой пример? –

ответ

0

Так как вы объяснили нет разрывов строк, то просто сделать Grep:

grep MAH..S Sequence.fasta | grep -bo MAH..S 
0:MAHAAS 

grep KK..D Sequence.fasta | grep -bo KK..D 
8:KKNRD 
35:KKKSD 

grep FES.MN Sequence.fasta | grep -bo FES.MN 
4:FESLMN 

grep K..QQ Sequence.fasta | grep -bo K..QQ 
2:KGSQQ 
10:KHLQQ 

Если поиск по шаблону дважды разрешено, а затем получить дополнительную информацию, как это:

grep -B1 K..QQ Sequence.fasta | awk -F"|" 'NR==1{print $2}' 
Q7Z7A1 

Getting диапазона тривиально, добавляя длину рисунка в позицию.

На самом деле используйте модуль re вместо использования grep. Я не заметил, что ваш вопрос был помечен Python. В противном случае выполните subprocess.call() из grep. В Python это будет:

import re 
with open('Sequence.fasta') as f: 
    lines = f.readlines() 

for line in lines: 
    m = re.match('MAH..S', line) 
    if not m: 
     continue 
    print(m.start(), m.group()) 

Получение правильного форматирования тривиально, что я оставляю вам. Это будет не матч через разрывы строк, но вы говорите, что нет разрывов строк.

+0

да, его питон я использовал re в поиске мотивов, я не могу получить местоположение с помощью индекса. –

+0

Я добавил решение Python. –