2017-09-11 1 views
2

두 파일을 비교하고 다른 파일의 하위 집합이있는 시퀀스를 추출하려고합니다. 그리고 식별자도 추출하고 싶습니다. 그러나 내가 할 수있는 것은 부분 집합을 포함한 시퀀스를 추출 할 수 있다는 것입니다. 예제 파일은 다음과 같습니다알려진 시퀀스로 fasta 파일에서 시퀀스 및 헤더 추출

text.fa 
>header1 
ETTTHAASCISATTVQEQ*TLFRLLP 
>header2 
SKSPCSDSDY**AAA 
>header3 
SSGAVAAAPTTA 

하고, 내가 코드를 실행하면

textref.fa 
>textref.fa 
CISA 
AAAP 
AATP 

, 나는이 출력 데 : 그러나

ETTTHAASCISATTVQEQ*TLFRLLP 
SSGAVAAAPTTA 

을, 내 예상 출력 헤더입니다 :

>header1 
ETTTHAASCISATTVQEQ*TLFRLLP 
>header3 
SSGAVAAAPTTA 

내 코드는 2입니다. 나는이 text.fa의 시퀀스를 데,이 sequencesmatched.txt에,

def get_nucl(filename): 
    with open(filename,'r') as fd: 
     nucl = [] 
     for line in fd: 
      if line[0]!='>': 
       nucl.append(line.strip()) 
     return nucl 
def finding(filename,reffile): 
     nucl = get_nucl(filename) 
     with open(reffile,'r') as reffile2: 
      for line in reffile2: 
       for element in nucl: 
        if line.strip() in element: 
          yield(element) 



    with open('sequencesmatched.txt','w') as output: 
      results = finding('text.fa','textref.fa',) 
      for res in results: 
       print(res) 
       output.write(res + '\n') 

그래서 : 부분은 첫째 나는이 시퀀스 파일을 만든 다음 나는 원래 FASTA 파일에서 자신의 헤더를 추출하려고 하위 문자열은 textref.fa입니다. 같이 출력으로서, I는 첫 번째 일치하는 하나의 시퀀스를 검색 할 수

def finding(filename,seqfile): 
     with open(filename,'r') as fastafile: 
       with open(seqfile,'r') as sequf: 
         alls=[] 
         for line in fastafile: 
           alls.append(line.strip()) 
         print(alls) 
         sequfs = [] 
         for line2 in sequf: 
           sequfs.append(line2.strip()) 
           if str(line.strip()) == str(line2.strip()): 
             num = alls.index(line.strip()) 
             print(alls[num-1] + line) 


print(finding('text.fa','sequencesmatched.txt')) 

그러나 :

ETTTHAASCISATTVQEQ*TLFRLLP 
SSGAVAAAPTTA 

그래서 다른 부분에서, 각각 헤더 및 이들 서열을 검색 할 수 :

>header1 
ETTTHAASCISATTVQEQ*TLFRLLP 

어쩌면 내가 두 번째 파일없이 그것을 할 수 있지만 오른쪽의 순서 및 각각의 헤더를 얻기 위해 루프를 만들 수 없습니다. 따라서, 나는 먼 길을 갔다. ..

당신이 도울 수 있으면 나는 행복 할 것이다! 당신은 당신의 파일이 항상 동일한 구조 인 경우 훨씬 쉽게 일을 할 수

+1

이것은 오류입니까? all [num-1], 그것은 귀하의 목록이 전부가 아니며, 파이썬으로 된 것입니다. 맞춤법을 놓친 거니? "s"가 빠졌습니다 – Bestasttung

+0

@Bestasttung 고마워요! 나는 통보하지 않았다. 이제는 오류가 발생하지 않지만 원하지 않는 결과를 얻지는 않습니다. 나는 그 질문을 편집하고있다. – bapors

답변

1

: 여기

def get_nucl(filename): 
    with open(filename, 'r') as fd: 
     headers = {} 
     key = '' 
     for line in fd.readlines():  
      if '>' in line: 
       key = line.strip()[1:] # to remove the '>' 
      else: 
       headers[key] = line.strip() 

    return headers 

내가 시작 파일을 믿고있어 "> headern를"무엇이든지,하지 당신은 몇 가지 테스트를 추가해야합니다. 이제 headers['header1'] = 'ETTTHAASCISATTVQEQ*TLFRLLP'과 같은 사전이 있습니다. 그래서 지금

당신이 그냥 딕셔너리 사용하는 상대를 만나 : 당신이 헤더는 그 값을 일치와 딕셔너리가 그래서

def finding(filename, reffile): 
    headers = get_nucl(filename) 
    with open(reffile, 'r') as f: 
     matches = {} 
     for line in f.readlines(): 
      for key, value in headers.items(): 
       if line.stip() in value and key not in matches: 
        matches[key] = value 

    return matches 

을, 당신은 당신이 하위 문자열이있는 경우 DICT에서 확인 할 수 있습니다 이미 헤더 값을 키로 가지고 있습니다.

그냥 print(finding(....)을 보았습니다. 함수가 이미 인쇄되었으므로 그냥 호출하십시오.

+0

코드를 이용해 주셔서 감사합니다 만, 출력으로 '없음'만 표시됩니다 .. – bapors

+0

네, 죄송합니다. line.stip()이 value와 key가 일치하지 않으면'''에서 line.strip()을 잊어 버렸습니다. '''.잘 작동 지금 – Bestasttung

+0

대단히 감사합니다. 그러나, 나는 여전히 첫 번째 헤더와 첫 번째 시퀀스를 얻을 수 있습니다. 그것은 나에게 두 번째 경기를 보여주지 않는다. – bapors

관련 문제