Dateien blockweise lesen/parsen (Beispiel: fasta Datei)
Verfasst: Freitag 29. März 2013, 01:32
Hallo,
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:Die Dateien können aus beliebig vielen solcher sogenannter records aufgebaut sein, welcher wiederrum aus einem einzeiligen header bestehen, der immer mit '>' beginnt und auf den beliebig viele Zeilen einer Sequenz folgen.
Ich möchte nun jeden record einzeln lesen und nebenbei noch header und sequence eines records trennen:
Output in der Konsole:
Der Code ist geringfügig langsamer, als wenn man selbst per Hand zeilenweise (und vernünftig) durch die Datei läuft, aber er ist kürzer und sieht schöner aus
Und er ist eine sinnvolle Anwendung für groupby.
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
