Dict in neue Datei schreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Hallo,
ich bin Pythonanfänger und stehe irgendwie vor einem Problem, was ich die letzten Tage nicht geschafft habe zu lösen. Sicher ist es wieder nur ein kleiner Denkfehler oder so etwas. Es wäre trotzdem sehr hilfreich, wenn mir jemand auf die Sprünge helfen könnte.

Zu meinem Problem:

Ich habe ein fasta.file welches in meinem Skript eingelesen und dementsprechend umgewandelt wird, dh nur die benötigten Sachen werden gefiltert. Der 'Filter' dh bestimmte Sequenzen ,welche ich aus dem fasta.file benötige sind in einem anderen File gespeichert. All dies ist bis dahin auch kein Problem. Es werden die gewünschten Sequenzen mit ID's jeweils herausgesucht. Das Ergebnis kann ich komplett mit der print-Methode auf dem Bildschirm wiedergeben.
Jedoch bekomme ich beim schreiben in die neue Datei nur die Sequenzen ausgegeben. Ich benötige aber zusätzlich noch vor jeder neuen Sequenz ein ">" und die dazugehörige ID (current ID). JEdoch bekomme ich dann nur eine Fehlermeldung, wenn ich dies versuche (nur zur Erklärung ein fasta.file hat folgendes Aussehen(fiktives Bsp)
>Al_12563
AKNRIGNMROSMWLGHK
>Al_64782
DRIFMG....

mein Code:

Code: Alles auswählen

f = open("Al_cbl.parsed") #Datei aus der die zu suchenden Sequenzen vorhanden sind

ID2sequence = {}        #dict erstellen

for line in f:
   line = line.replace("\n", "")       #ersetze jede Kopfzeile
   ID2sequence[line] = ""

f = open("Ara_ly_1.6_pr.fasta") #Datei in der gesucht werden soll und gefiltert

currentID = ""              # ID ist null

for line in f:              #wenn line in fasta
    if ">" in line:         
        line = line.replace("\n", "")
        line = line.replace(">", "") 
        currentID = line                
    else:
        if ID2sequence.has_key(currentID):
            ID2sequence[currentID] += line.replace("\n", "")

g = open("Al.blastout","w") # neue Datei in welche geschrieben wird

for ID in ID2sequence.keys():
   g.write(ID2sequence[ID]+"\n") # gibt Sequenzen in jeder neuen Zeile aus
g.close()
Wäre echt super wenn mir jemand beim letzten Schritt noch helfen könnte.

Vielen Dank schonmal im Voraus.
Gruß
Martina
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Bin nicht so 100%ig sicher, ob ich Dein Problem verstanden habe. Kann leider auch nichts probieren, da gerade auf dem Flughafen bin. Aber das sollte vielleicht gehen:

Code: Alles auswählen

g.write(">"+str(ID)+ID2sequence[ID]+"\n") # gibt Sequenzen in jeder neuen Zeile aus
Oder ist es das, was den Fehler bringt?
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Hallo HendrikS,
erstmal vielen Dank für die schnelle Antwort.
Vielen Dank funktioniert echt einwandfrei.
Ohje, also doch wieder ganz simpel.

Ich muss nur noch ausprobieren, ob ich die Dateien so verwenden kann.

Da die Sequenzen unterscheidlich lang sind, kann es sein dass sie nicht unbedingt in eine Zeile passen und somit immer nur eine Zeile lang sind. Ohje kauderwelsch.

Naja also erstmal nochmal vielen lieben Dank und falls doch noch ein Problem auftritt, werde ich nochmal nachfragen, wenn ich's nicht allein zum laufen bekomme.

Guten Flug ;-)

Gruß
Martina
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hallo Martina,

Du willst nicht wirklich Parser für Sequenzfiles schreiben, oder? Da gibt es schon biopython und SeqIO ist das, was Du zunächst brauchst. (Funktioniert auch prima mit Proteinsequenzen.) Und eine BLAST-Suche bietet biopython auch. Warum also selber coden?

HTH,
Christian
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Hallo Christian,

erstmal vielen Dank für die Anregung.
Da ich aber immer mal wieder kleinere Skripte schreiben muß in Zukunft, für weitere Probleme finde ich es praktischer mit 'einfachen' (ok nicht unbedingt für mich) Skripten zu beginnen und so der Pythonsprache näher zu kommen.
Aber ich werde mir bei Gelegenheit mal Biopython näher ansehen. Habe das beim Einlesen schon wahrgenommen, bin jedoch nicht weiter darauf eingegangen.

Ich habe jedoch noch eine kleine Frage. Nun funktioniert ja mein Skript, jedoch nicht bei allen meinen fasta.files. Obwohl ich irgendwie keine Unterschiede zwischen den funktionierenden files und den nicht-funktionierenden Files finde. Vielleicht sieht ja jemand mit Erfahrung hier ein Problem in den Files bzw wie ich mein Skript umändern müßte? Wäre echt super.

Hier ein Bsp für ein funktionierendes file:

>jgi|Araly1|887209|scaffold_100003.1
MRERQVVGAEKLIQLLHPSEDRMGNSIHCTGLESHRYTPSILAASTILSYVKH*
>jgi|Araly1|470049|fgenesh2_kg.1__3__AT1G02180.1
MKNGISFLKSILLFLSLSLVLASSKLHGNPAHEMVGVLNQNRTAQKLGKLNESPGLGCMALQYVELCEGN
CNVNNTLSCDPPEDDFTQVFAPNCGVELPTFGTITGHILGCSSKYAAPEVTFSDILFRDNKALSVLRNRS
HTEVGVGMARLHKGTFFWCLLFSDGVTNSSFALEDNGRGIKQRKGCYSGSAFPCSSNAYMMCMRLLNSFL
GLVFSSFCLFEKHLKS*

natürlich sind die files länger

und hier ein nicht funktionierendes file:
>AC177814.3_FGT016
MAVAGGRAQQSRRQPGSRLILGQQESLLPRREDGAFNAKSESDRQSGLAKGATTNSAPPD
PRARTRAKTRKTANSAPPDPRARPRAKTRKTANSAPPDPRARTRAKTRKTANSAPPDPRA
RTRAKTRKMVNSAPPDPRARTRAKTRKTANSAPPDPRARTRAKTWKTANSAPPDPRARTR
AKTRKTTKLRLARPQGSDSALASAKRPPPRPTPWLGLGLGNRRQTQPRLRRSPHVTPPRA
QTRHVNRKRHHRPTPNRLGSRRTRPASHPASSAGWAMMALHKLCDDGGPQLSYGSRATSA
RTRPLQQLSLRQAPSHLRQPRHHASKVPRPLRLPHWHVPRALALSPLDT
>AC177814.3_FGT032
MSLTHVDPHVRINDLAHHFKHCVALVKEMWSSDEAVRVRSRFLCLIHVVQRIVLRRIELC
GEVELLSILQYVKRCLTFAGLAPALGGCFVEVGAGTATSEASCSDVFREGLGASSVRLMR
VASGLDNSGKTTIVLKINGEDTSIISPTLGFNIKTIKYHKYSLNIWDVGGQKTIRSYWRN
YFEQTDGLVWVVDSSDIRRLDDCRAELHNLLKEERLVGASLLVFANKQDIQGALKPDEIA
KADSPSIFFQVLNLEVMDRSRHWKIVGCSAYTGEGLLEGFDWLVQDVASRIYVLD

bzw bekomme ich in meiner Ausgabedatei nur die ID's und nicht die zugehörigen Sequenzen. Dies ist mir bei ca 10 von 18 Sequenzen passiert und ich habe im Code schon versucht, aber ich weiß auch nicht wo der Fehler liegen kann.

Wäre echt erfreut für einen Hinweis, woran es liegen kann.
Vielen Dank schonmal für Eure Hilfe.

Gruß,
Martina
Antworten