문제

저는 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top