Dateien blockweise lesen/parsen (Beispiel: fasta Datei)

Code-Stücke können hier veröffentlicht werden.
Antworten
Eugenie
User
Beiträge: 7
Registriert: Sonntag 27. Januar 2013, 12:43

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:

Code: Alles auswählen

>header01
CCTGCGGAAGATCGGCACTAGAATAGCCAG
AACCGTTTCTCTGAGGCTTCCGGCCTTCTC
TCCCACTAATAATTCTGAGG
>header02
CCATCGGTAGCGCATCCTTAGTCCAATTAAG
TCCCTATCCAGGCGCTCCGCCGAAGGTCTAT
ATCCATTTGTCAGCAGACACGC
>header03
CCACCCTCGTGGTATGGCTAGGCATTCAGGA
ACCGGAGAACGCTTCAGACCAGCCCGGACTG
GGAACCTGCGGGCAGTAGGTGGAAT
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:

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'
Output in der Konsole:

Code: Alles auswählen

header01
CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCTCTCCCACTAATAATTCTGAGG

header02
CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCTATATCCATTTGTCAGCAGACACGC

header03
CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT
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 :mrgreen: Und er ist eine sinnvolle Anwendung für groupby.
Antworten