Seite 1 von 1

Matrix einlesen aus txt, abspeichern und darauf zugreifen

Verfasst: Freitag 22. November 2013, 01:08
von fe22st
Hi leute,

bin gerade dabei ein Programm zu schreiben, aber ich weiß nicht genau wie ich am besten da ran gehen soll.

Zunächst habe ich eine Matrix in einer Datei welche folgendermaßen aufgebaut ist:

Code: Alles auswählen

    A    R    N    D
A   4   -1   -2   -2
R  -1    5    0   -2
N  -2    0    6    1
D  -2   -2    1    6
Diese tabelle kann aber beliebig groß sein.

Bisher kann ich diese schon aufrufen und auch so ausgeben.

Nur muss ich diese anstatt auszugeben abspeichern, damit ich später auf die Werte zugreifen kann.
Also ich möchte beispielsweiße schreiben:

Code: Alles auswählen

getZahl(A,R) // Dies muss laut meiner Tabelle "-1" zurückgeben
Wie speichere ich am besten solch eine tabelle und wie gehe ich da vor diese abzuspeichern, damit
ich solch eine abfrage starten kann?

Und kann ich irgendwie dabei überprüfen ob eine Zahl vergessen wurde?
Ich hoffe ihr könnt mir weiterhelfen

Code: Alles auswählen

def read_fasta_file(path):
	in_file = open(path,"r")
	
	
	text = in_file.readlines()
	
	for line in text:
		print(line)

	in_file.close()
	
	return text
	
def main():
        path = sys.argv[1]
        read_fasta_file(path)
        
if __name__ == "__main__":
        main()

Re: Matrix einlesen aus txt, abspeichern und darauf zugreife

Verfasst: Freitag 22. November 2013, 02:15
von BlackJack
@fe22st: Wenn Du ``getZahl(A.R) // Dies muss laut meiner Tabelle "-1" zurückgeben`` schreiben möchtest, dann musst Du eine andere Programmierprache verwenden. Das ist kein gültiges Python.

Du wirst nicht nur eine Liste mit den Zeilen als Zeichenketten einlesen müssen, sondern die Zeilen auch verarbeiten, also zum Beispiel die Zeilen in ihre Bestandteile zerlegen, Kopfzeile und -spalte von den Werten trennen, Zahlendarstellungen in Zahlen umwandeln, und dann das ganze in einer passenden Datenstruktur ablegen. Zum Beispiel den Werteteil der Tabelle in einer verschachtelten Liste und jeweils für Kopfzeile und -spalte eine Abbildung von Kopfwert zu Indexwert, damit man diese Werte für den Zugriff verwenden kann.

Da hier diese drei Strukturen und darauf operierende Funktionen existieren, sollte man das in einen eigenen Datentyp zusammenfassen. Dazu braucht man also Python-Grundlagenkenntnisse bis einschliesslich objektorientierter Programmierung (OOP). In der Python-Dokumentation befindet sich ein Tutorial.

Bei dem Namen `getZahl()` würde ich auch einen Blick in den Style Guide for Python Code empfehlen.

Was bedeutet das `_fasta_` im Namen der Lesefunktion? Ich hätte ja erst auf das gleichnamige Dateiformat aus dem Bioinformatik-Bereich getippt, aber das sieht soweit ich weiss anders aus.

Dateien sollte man mit der ``with``-Anweisung verwenden. Dann muss man sich nicht mehr explizit um das schliessen kümmern, das passiert dann in *jedem* Fall in dem der Block verlassen wird.

Eine Funktion die laut Namen etwas einliesst sollte nur das machen. Und nicht auch noch die ganzen Daten ausgeben.

Die Funktion ist eigentlich dieser Dreizeiler:

Code: Alles auswählen

def load_fasta_file(path):
    with open(path) as lines:
        return list(lines)

Re: Matrix einlesen aus txt, abspeichern und darauf zugreife

Verfasst: Freitag 22. November 2013, 02:26
von fe22st
vielen Dank für die schnell Antwort.

meinte natürlich:

getZahl(A,R)

ein ","


Fasta heißt einfach die Textdatei.

Also eine komplett geschachtelte Liste.
Wie müsste ich diese aufspalten?
Gibt es dazu auch ein tutorial?

oder in welcher form müsste die Liste gesplittet werden.

Sowas in dieser Art:

[ [(A,A,4),(R,A,-1),(N,A,-2),(D,A,-2),] [(A,R,-1),(R,R,5),(N,R,0),(D,R,-2)] und so weiter? ]

Re: Matrix einlesen aus txt, abspeichern und darauf zugreife

Verfasst: Freitag 22. November 2013, 02:47
von BlackJack
@fe22st: Ein Tutorial für exakt Dein Problem wird es sicher nicht geben.

So *könnte* man die Daten speichern, das ist aber sicher keine gute Struktur wenn Du mit Zeichenketten wie 'A.R' auf die einzelnen Elemente zugreifen möchtest. Vielleicht möchtest Du das auch in einem Wörterbuch (`dict`) ablegen welches Zeichenketten der Form 'A.R' auf den jeweiligen Wert abbildet. Oder Tupel der Form ('A', 'R'). Dann käme man mit einer Funktion zum Einlesen aus. Dann geht allerdings die Reihenfolge der Matrix aus der Datei verloren. Die könnte man mit einem `collections.OrderedDict` erhalten.

Um entscheiden zu können wie die passende Datenstruktur aussieht, muss man wissen was mit den Daten gemacht wird. Wie sehen die Zugriffsmuster aus, welche Eigenschaften müssen erhalten bleiben.

Re: Matrix einlesen aus txt, abspeichern und darauf zugreife

Verfasst: Freitag 22. November 2013, 03:02
von fe22st
also das mit dem (A.B) soll in dieser form nicht eingeben werden.

wenn überhaupt, in dieser Form: getZahl(A,B) oder wie du beschrieben hast: getZahl('A','B')

es geht lediglich um die rückgabe des wertes, welcher unter den 2 eingebenen Buchstaben zu finden ist.

Was aber auch auffällt, ist ja dass die "Matrix" so aufgebaut ist, das diese gespiegelt wird, und somit alle werte
zweimal in dieser abgespeichert sind.

Re: Matrix einlesen aus txt, abspeichern und darauf zugreife

Verfasst: Freitag 22. November 2013, 03:09
von BlackJack
@fe22st: Na dann würde ich mal sagen ein einfache Wörterbuch genügt. Dein ``getZahl('A', 'R')`` müsste dann gar keine Funktion mehr sein, sondern ein ``matrix['A', 'R']`` genügt. Die Matrix selber hätte bei deinem Funktionsaufruf auch noch gefehlt, also hätte das eher ``get_zahl(matrix, 'A', 'R')`` heissen müssen.

Re: Matrix einlesen aus txt, abspeichern und darauf zugreife

Verfasst: Freitag 22. November 2013, 12:53
von fe22st
Mein Problem liegt in der speicherung der Daten aus der Tabelle.
In welcher Form ich diese als Liste abspeichern aber trotzdem noch auf die Werte in der Tabelle zugreifen kann.

Re: Matrix einlesen aus txt, abspeichern und darauf zugreife

Verfasst: Freitag 22. November 2013, 13:11
von BlackJack
@fe22st: Wieso denn als Liste? Wenn der einzige Zugriff über Tupel aus den beiden Buchstaben erfolgt, dann ist eine Liste äusserst unpraktisch und ein Wörterbuch (`dict`) genau das richtige.

Re: Matrix einlesen aus txt, abspeichern und darauf zugreife

Verfasst: Freitag 22. November 2013, 13:49
von fe22st
Also in solch einer form:

Als Dictionary?

{ ' ' : 'A': 'R' : 'N' : 'D',
'A' : '4' : '-1' : '-2' : '2',
'R' : '-1' : '5' : '0' : '-2',
'N' : '-2' : '0' : '6 : '1',
'D' : '-2' : '-2' : '1' : '6'
}

Re: Matrix einlesen aus txt, abspeichern und darauf zugreife

Verfasst: Freitag 22. November 2013, 14:10
von BlackJack
@fe22st: Das ist kein Dictionary. Du solltest Datenstrukturen und literale Datentypen nicht raten. Für so etwas gibt es Dokumentation und Tutorials. Arbeite das in der Python-Dokumentation doch mal durch. Danach weisst Du wie Wörterbücher als Literale aussehen und welche Operationen darauf definiert sind. Falls Du absoluter Programmieranfänger bist, könntest Du vorher auch Learn Python The Hard Way durcharbeiten.