문제
저는 Python 프로그래밍 분야의 초보자입니다.몇 가지 분석을 하려고 할 때(다른 게시물에서 답변을 찾으려고 노력했지만 아무것도 없음) 아마도 매우 어리석은 첫 번째 질문을 게시하기로 결정했습니다.이 예에서는 최소 8개(시퀀스 8000자 이상)가 있어야 하는데 출력 파일이 하나만 생성되는 이유는 무엇입니까?미리 답변해 주셔서 감사합니다.
def batch_iterator(iterator, batch_size) :
entry = True
while entry :
batch = []
while len(batch) < batch_size :
try :
entry = iterator.next()
except StopIteration :
entry = None
if entry is None :
#End of file
break
batch.append(entry)
if batch :
yield batch
from Bio import SeqIO
record_iter = SeqIO.parse(open("some.fasta"),"fasta")
for i, batch in enumerate(batch_iterator(record_iter, 1000)) : #I think sth is wrong here?
filename = "group_%i.fasta" % (i+1)
handle = open(filename, "w")
count = SeqIO.write(batch, handle, "fasta")
handle.close()
print "Wrote %i records to %s" % (count, filename)
해결책
시퀀스 청크
OP와의 긴 논의 끝에 다음은 다음에 정의된 생성기 기능을 사용하여 매우 재구성된 제안입니다. 이 다른 SO 스레드
# file: main.py
from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
def chunks(l, n):
"""Yield successive n-sized chunks from l."""
for i in xrange(0, len(l), n):
yield l[i:i+n]
if __name__ == '__main__':
handle = open('long.fasta', 'r')
records = list(SeqIO.parse(handle, "fasta"))
record = records[0]
for pos, chunk in enumerate(chunks(record.seq.tostring(), 1000)):
chunk_record = SeqRecord(Seq(
chunk, record.seq.alphabet),
id=record.id, name=record.name,
description=record.description)
outfile = "group_%d.fasta" % pos
SeqIO.write(chunk_record, open(outfile, 'w'), "fasta")
원본 코드는 매우 다른 작업을 수행합니다.소요된다 새로운 기록 에서 제공하는 발전기에서 SeqIO.parse
기능을 수행하고 이를 다른 파일에 저장하려고 시도합니다.분할하고 싶다면 단 하나의 기록 더 작은 하위 시퀀스에서는 다음과 같이 수행되는 레코드의 내부 데이터에 액세스해야 합니다. record.seq.tostring()
.그만큼 chunks
위에 링크된 다른 스레드에 설명된 대로 생성기 함수는 전달된 시퀀스에서 빌드할 수 있는 최대한 많은 청크를 반환합니다.각각은 다른 파일에 새로운 fasta 레코드로 저장됩니다(시퀀스만 유지하려면 chunk
오픈한 곳으로 직접 outfile
).
작동하는지 확인하세요.
다음 코드를 고려해보세요.
# file: generate.py
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio.Alphabet import IUPAC
from Bio import SeqIO
long_string = "A" * 8000
outfile = open('long.fasta', 'w')
record = SeqRecord(Seq(
long_string,
IUPAC.protein),
id="YP_025292.1", name="HokC",
description="toxic membrane protein, small")
SeqIO.write(record, outfile, "fasta")
"long.fasta"라는 파일에 단일 레코드를 씁니다.이 단일 레코드에는 다음에서 생성된 대로 내부에 8000자 길이의 시퀀스가 있습니다. long_string
.
사용 방법:
$ python generate.py
$ wc -c long.fasta
8177 long.fasta
8000자가 넘는 오버헤드는 파일 헤더입니다.
위의 코드 조각을 사용하여 해당 파일을 각각 1000 길이의 청크로 분할하는 방법:
$ python main.py
$ ls
generate.py group_1.fasta group_3.fasta group_5.fasta group_7.fasta main.py
group_0.fasta group_2.fasta group_4.fasta group_6.fasta long.fasta
$ wc -c group_*
1060 group_0.fasta
1060 group_1.fasta
1060 group_2.fasta
1060 group_3.fasta
1060 group_4.fasta
1060 group_5.fasta
1060 group_6.fasta
1060 group_7.fasta
8480 total