ich habe mich schon öfter gefragt, wie man in Python Dateien blockweise anhand eines bestimmten Trennzeichens lesen kann. Heute Abend habe ich mich mal wieder mit fasta files rumschlagen müssen und nebenbei einen schönen Weg gefunden, wie man das mit itertools.groupby() erledigen kann. Der folgende Code kann einfach abgeändert werden für verschiedene Dinge, ich zeige es hier einfach am Beispiel einer fasta-Datei.
Aufbau von fasta files:
Code: Alles auswählen
>header01
CCTGCGGAAGATCGGCACTAGAATAGCCAG
AACCGTTTCTCTGAGGCTTCCGGCCTTCTC
TCCCACTAATAATTCTGAGG
>header02
CCATCGGTAGCGCATCCTTAGTCCAATTAAG
TCCCTATCCAGGCGCTCCGCCGAAGGTCTAT
ATCCATTTGTCAGCAGACACGC
>header03
CCACCCTCGTGGTATGGCTAGGCATTCAGGA
ACCGGAGAACGCTTCAGACCAGCCCGGACTG
GGAACCTGCGGGCAGTAGGTGGAAT
Ich möchte nun jeden record einzeln lesen und nebenbei noch header und sequence eines records trennen:
Code: Alles auswählen
import itertools
def parse_fasta( fileHandle ):
delimiter = lambda line: line.startswith( '>' )
for is_header, block in itertools.groupby( fileHandle, delimiter ):
if is_header:
header = block.next()[1:].rstrip()
else:
yield( header, ''.join( line.rstrip() for line in block ) )
with open( "test.fa", "r" ) as file:
for header, sequence in parse_fasta( file ):
print header
print sequence, '\n'
Code: Alles auswählen
header01
CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCTCTCCCACTAATAATTCTGAGG
header02
CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCTATATCCATTTGTCAGCAGACACGC
header03
CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT