안녕하세요 한주현입니다.
오늘은 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 파일을 읽는 방법에 대해 알아봤습니다.
부디 여러분들께 도움되셨음 좋겠네요
그럼 다음 시간에 만나요 ~~~~
'생물정보학 > Biopython (바이오파이썬)' 카테고리의 다른 글
[생물정보학 파이썬] 코로나 바이러스-19 (COVID-19) 서열 분석, WebLogo, Multiple Sequence Alignment, 계통수 (phylogenetic tree) 그리기 (10) | 2020.03.01 |
---|---|
[도서] 바이오파이썬으로 만나는 생물정보학 (26) | 2019.03.12 |
[바이오파이썬] 4.4 SeqRecord 비교 - NotImplemented 오류 - 파이썬 객체간의 비교 __eq__ 의 의미 (0) | 2018.05.26 |
[바이오파이썬] 4.3.2 SeqFeature 의 position, location (0) | 2018.05.24 |
[바이오파이썬] 4.3.1 SeqFeature 객체 (0) | 2018.05.22 |
댓글