Zwei Dokumente vergleichen

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
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Hallo zusammen

Ich habe zwei Dokumente O.dat, U.dat, wobei die Daten in U.dat eine Untermenge der Daten in O.dat darstellen. D.h. alles, was in U.dat steht, steht sicher in O.dat, in O.dat steht aber noch etwas mehr. Die Files sehen so aus:

O.dat (berechnete Werte):

1ABC XXX 13 A 4.40
1ABC XXX 19 A 5.53
1ABC XXX 49 A 6.50
1ABC XXX 77 A 4.90


U.dat (experimentell bestimmte Werte):

1ABC XXX 13 A 4.80
1ABC XXX 49 A 6.30

Das ganze geschieht vor folgendem Hintergrund: Wir arbeiten mit Proteinen (1ABC ist ein Protein-ID Code) und versuchen gewisse physikalische Eigenschaften davon zu berechnen (Säurekonstanten der einzelnen Aminosäuren). Zur Überprüfung unserer Berechnungen verwenden wir experimentelle Daten (die in U.dat stehen). Die berechneten Werte stehen in O.dat. Theoretisch berechnen lassen sich Säurekonstanten für alle Aminosäuren, experimentel überprüfen lassen sich meist nicht alle, deshalb ist U.dat kleiner als O.dat, und hat i.d.R. nicht die gleichen Werte.

Das Ziel ist jetzt, eine Liste ausgeben zu können, die so aussieht:

Name......XXX.....Nummer.....A......Exp-Wert........Calc-Wert
---------------------------------------------------------------------
1ABC......XXX.....13..............A......4.80...............4.40
1ABC......XXX.....49..............A......6.30...............6.50



Ich hab das eigentlich schon ganz gut hingekriegt, frage mich aber, ob es nicht vielleicht ein Modul gibt, dass solche Funktionalität direkt anbietet (Python3.0.1). Poste natürlich gerne meinen Code, obwohl der bringt wohl niemandem was und ist auch hochgradig unleserlich, aber funktioniert.

Besten Dank für Postings
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ich würde dafür ein dictionary verwenden. Die Schlüssel sind "1ABC XXX 13" etc., die Werte die jeweiligen Werte. Dann iterierst du über das U-dict, holst dir über den identischen Schlüssel den Wert aus dem O-dict dazu. Falls du es nicht direkt ausgeben willst (z.B. wegen Sortierung) könnte man die beiden Werte in einem Wertetupel zusammenfassen.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

danke. das klingt nach einer guten Idee.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

mzh hat geschrieben:danke. das klingt nach einer guten Idee.
Naja, halb gut. Für U.dat brauchst du kein dictionary. Stattdessen eher zeilenweise über die Datei U.dat iterieren, über das O-dict den Wert aus O.dat holen und gemeinsam damit direkt als neue Zeile in eine Datei schreiben, die deine Ergebnisse enthält.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

ich hab ziemlich genau so was bis jetzt gehabt, aber anstatt, dass ich ein dict gemacht habe, habe ich die U.dat zeilenweise eingelesen und die Zeilen gesplittet. Dann habe ich einfach die Nummer als Filter genommen und von der O.dat nur die Werte geholt, für die es einen experimentellen Wert gab (mit der gleichen Nummer). Technische details. Was mich dennoch interessieren würde ist, ob es fertige Python-Module für sowas gibt.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

mzh hat geschrieben:Was mich dennoch interessieren würde ist, ob es fertige Python-Module für sowas gibt.
Weiß ich nicht, aber wofür brauchst du da ein Modul? Bis man dafür ein Modul gefunden und sich an die Anwendung gewöhnt hat, hat man es doch selbst gemacht:

Code: Alles auswählen

from __future__ import with_statement

odict = {}
with open("o.dat") as odat:
    for line in odat:
        key, value = line.strip().rsplit(" ",1)
        odict[key] = value
rdat = open("r.dat","w")
with open("u.dat") as udat:
    for line in udat:
        key, value = line.strip().rsplit(" ",1)
        rdat.write("%s %s %s\n" %(key,value,odict[key]))
rdat.close()
Mehr ist das doch nicht (die spezielle Formatierung der Ausgabe fehlt noch). Die erste Zeile entfällt, wenn du Python >= 2.6 verwendest.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

@numerix: danke.
[url=http://www.proandkon.com]proandkon.com[/url]
Antworten