본문 바로가기
생물정보학/Biopython (바이오파이썬)

[바이오파이썬] 5.1.1 SeqIO 모듈로 서열 파일 읽기 - FASTA

by HanJoohyun 2018. 12. 24.
반응형

 

 


 

안녕하세요 한주현입니다.


오늘은 SeqIO 로 파일읽는 방법에 대해 알아보겠습니다.


SeqIO로는 FASTA, FASTQ, GenBank 등의 파일을 읽을 수 있는데 오늘은 SeqIO의 메서드와 FASTA 파일 읽기를 살펴보겠습니다.







목표


SeqIO 모듈의 Sequence 파일을 읽는 두 가지 메서드인 SeqIO.read(), SeqIO.parse()에 대해 알아보겠습니다.


SeqIO 모듈을 활용하여 FASTA 파일을 읽는 방법에 대해 알아보겠습니다.




준비물


오늘은 준비물이 없습니다 ㅎㅎ


예시 파일은 우리가 그냥 메모장으로 만들어봐요~




SeqIO의 두 가지 메서드


SeqIO 모듈을 가지고 Sequence 파일을 읽을 때 두 가지 메서드가 있습니다.


SeqIO.read()


SeqIO.parse()


간단히 차이를 말해보자면,


SeqIO.read() 메서드는 단일 레코드를 읽고,


SeqIO.parse() 메서드는 하나 이상의 레코드를 읽을 수 있습니다.





준비물 생성


메모장으로 실습파일을 만들어 보겠습니다.


파일 이름은 one.fasta 로 만들어보죠


1
2
3
>one
AAAACCCCGGGGTTTT
ACGTACGTACGTACGT


파일을 하나 더 만들어 보겠습니다. 이번에는 two.fasta


1
2
3
4
5
6
>one
AAAACCCCGGGGTTTT
ACGTACGTACGTACGT
>two
AAAACCCCGGGGTTTT
ACGTACGTACGTACGT


서열 안의 내용은 여러분들이 넣고 싶은거 넣으셔도 무방합니다.. ㅋㅋ


단, one.fasta 에는 하나의 레코드가, two.fasta 에는 두 개의 레코드를 넣어주세요..






SeqIO로 FASTA 읽기



단일 레코드 읽기


SeqIO.read() 메서드로 one.fasta 읽기.


1
2
3
4
5
6
7
8
9
10
11
12
from Bio import SeqIO
 
seq = SeqIO.read("one.fasta","fasta")
print(type(seq)) # <class 'Bio.SeqRecord.SeqRecord'>
print(seq)
 
# Result
ID: one
Name: one
Description: one
Number of features: 0
Seq('AAAACCCCGGGGTTTTACGTACGTACGTACGT', SingleLetterAlphabet())



SeqIO.read() 메서드에는 (파일 이름, 파일 종류) 이렇게 두 개의 인자가 들어갑니다.



SeqIO.parse() 메서드로 one.fasta 읽기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from Bio import SeqIO
 
seq = SeqIO.parse("one.fasta","fasta"
print(type(seq))  # <class 'generator'>
print(seq)  # <generator object parse at 0x10d2c2780>
 
for s in seq:
    print(type(s))  # <class 'Bio.SeqRecord.SeqRecord'>
    print(s)
 
# Result 
ID: one
Name: one
Description: one
Number of features: 0
Seq('AAAACCCCGGGGTTTTACGTACGTACGTACGT', SingleLetterAlphabet())


SeqIO.parse() 메서드에도 (파일 이름, 파일 종류) 이렇게 두 개의 인자가 들어갑니다.



뭐가.. 차이지 싶은데..


그래서 중간중간마다 type() 으로 객체가 담고 있는 데이터 타입을 다 찍어봤죠..ㅋㅋ



SeqIO.read() 가 읽으면 바로 SeqRecord 객체가 나오는데


SeqIO.parse() 로 읽으면 쌩뚱맞게 generator 가 나옵니다..



 제너레이터가 어떤건지 모르신다면 여기서는 그냥 for 문으로 돌리면 하나씩 나오는 이터레이터 같은거라고 생각하시고 가심 되겠습니다.


리스트에서 for 문 돌리면 안에 아이템들이 하나씩 나오는거 처럼요..


근데 리스트랑 다른점은 아이템들을 메모리에 한 번에 다 올리지 않아 메모리 부담이 적다는 점입니다.


제너레이터의 자세한 내용은 구글님께 ... ㅋㅋㅋ




가장 큰 차이점이 바로 SeqIO.parse() 의 반환이 SeqRecord를 담고 있는 제너레이터가 나온다는 것입니다.


그래서 두 개 이상의 레코드를 읽으려면 SeqIO.read()를 사용하는 것이 아닌 SeqIO.parse()를 사용하셔야 합니다!! ㅎㅎ



한 번 해보죠!



두 개 이상의 레코드 읽기


두 개의 레코드가 들어있는 two.fasta 파일을 


SeqIO.read() 메서드를 가지고 읽어보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from Bio import SeqIO
 
seq = SeqIO.read("two.fasta","fasta")
print(type(seq))
print(seq)
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-32-ab5c51eaca40> in <module>()
      1 from Bio import SeqIO
      2 
----> 3 seq = SeqIO.read("two.fasta","fasta")
      4 print(type(seq)) # <class 'Bio.SeqRecord.SeqRecord'>
      5 print(seq)
 
/Users/jhan/anaconda/lib/python3.6/site-packages/Bio/SeqIO/__init__.py in read(handle, format, alphabet)
    710         second = None
    711     if second is not None:
--> 712         raise ValueError("More than one record found in handle")
    713     return first
    714 
 
ValueError: More than one record found in handle


뭔가.. 안되네요 ㅋㅋ 왜 안되는지 살펴봅시다.


ValueError: More than one record found in handle


마지막 줄을 보니 More than one record 가 눈에 들어옵니다.


SeqIO.read() 메서드로는 두 개 이상의 레코드가 있는 파일을 읽을 수 없습니다.




그러면 SeqIO.parse() 메서드로 해보죠.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from Bio import SeqIO
 
seq = SeqIO.parse("two.fasta","fasta"
print(type(seq))  # <class 'generator'>
print(seq)  # <generator object parse at 0x10d2c2200>
 
for s in seq:
    print(type(s))  # <class 'Bio.SeqRecord.SeqRecord'>
    print(s)
 
 
# Result
ID: one
Name: one
Description: one
Number of features: 0
Seq('AAAACCCCGGGGTTTTACGTACGTACGTACGT', SingleLetterAlphabet())
<class 'Bio.SeqRecord.SeqRecord'>
ID: two
Name: two
Description: two
Number of features: 0
Seq('AAAACCCCGGGGTTTTACGTACGTACGTACGT', SingleLetterAlphabet())


음.. 잘되네요 ㅋㅋ


SeqRecord 를 담고 있는 제너레이터를 for 문으로 돌면서 두 개이상의 레코드를 담고 있는 파일을 잘 읽었습니다!!! ㅎㅎㅎ








오늘은 SeqIO 모듈의 두 가지 메서드의 차이와 FASTA 파일을 읽는 방법에 대해 알아봤습니다. 


부디 여러분들께 도움되셨음 좋겠네요

 

그럼 다음 시간에 만나요 ~~~~

 

 

기부 버튼을 만들었습니다
단지 $1 의 작은 정성도 저에게는 큰 힘이 됩니다
기부해주신 분들을 기억하며
더 좋은 내용으로 보답해 드리겠습니다 :)

Donate 버튼은 paypal 결제로 paypal 계정이 없으시더라도
카드로도 기부 가능하십니다 :)
Use your credit card or bank account (where available). 옆의 continue 를 누르시면 됩니다

한주현 드림



 




반응형

댓글