Seite 1 von 1

Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Dienstag 20. Oktober 2020, 21:27
von Krischu
Brauche noch mal einen Tip zur Herangehensweise:

Ich habe eine Symboltabelle eines ld-outputs (unix loader), und will die in ein Dictionary einlesen, um sie später über einen Key zu durchsuchen.
Die Datei hat 3 Spalten:

Code: Alles auswählen

00000010  A TCBlength
0000002c  A  TSAlength
10000934  B  Dstack
1000040c  B  ExcFrame
00001c8e T warm
00001a78 T zero
Ich will diese Zeilen in ein Dictionary (?) einlesen und später Tokens nach Adresse in dem Dictionary suchen können.
Sinngemäß (skizzenhaft):

Code: Alles auswählen


syms=dict.fromkeys(['Address', 'Type', 'Name'])

return (Name,Type) [0x2c] 


Wie geht man das am besten an?

Code: Alles auswählen

import csv

csvfile = './syms.txt'
syms=dict.fromkeys(['Address', 'Type', 'Name'])
f=open(csvfile,'r') # opens file for reading
reader = csv.reader(f,delimiter=' ')
for line in reader:
    print (line)
syms
Ich habe noch nicht die Verbindung zwischen den Zeilen der Datei und dem Dictionary gefunden.

Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Dienstag 20. Oktober 2020, 21:47
von __blackjack__
@Krischu: Es macht wenig Sinn wenn Du weisst was Du willst, uns aber nur ausgedachte Python-Semantik zeigst die so nicht funktioniert. Du musst schon beschreiben was das bedeuten soll, und in Beispielen Python-Semantik verwenden die funktioniert. Das ``return`` versucht aus einem Tupel mit zwei Elementen das 45. Element zurückzugeben. Was ganz offensichtlich nicht funktionieren kann.

Die Eingabe ist nicht wirklich CSV, da würde ich das Modul auch nicht verwenden. Die Elemente die aus dem `reader` kommen würde man eher `row` als `line` nennen.

Die Verbindung der Zeilen zum Wörterbuch muss Dir klar sein, denn wie willst Du ohne das Dir das klar ist uns oder Python beschreiben was passieren soll?

Was hast Du da in der Datei? Drei Spalten? Was bedeuten die?

Wörterbücher bilden Werte auf andere Werte ab. Welche Werte sollen auf welche anderen Werte abgebildet werden?

`syms` macht in dem Beispiel keinen Sinn weil es gar nicht verwendet wird.

Dateien sollte man mit der ``with``-Anweisung zusammen öffnen, damit sie auch sicher wieder geschlossen werden.

Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Dienstag 20. Oktober 2020, 21:58
von Krischu
Die Bedeutung der drei Spalten habe ich ja im Dictionary-Layout angedeutet ('Address', 'Type', 'Name').

Ich hatte ja geschrieben, daß ich noch nach der Verbindung zwischen syms (syms.txt, Daten am Anfang meines Posts, 3 Spalten durch Blank getrennt) und meiner Datenstruktur suche.

Kurz gesagt: Ich habe Tupel (Adresse,Type,Name). Daten wie am Anfang meines Posts.
Ich dachte, daraus ein Dictionary zu machen, um schnell eine Adresse nachschlagen zu können, und darüber den Namen und Typ zurückzubekommen.

Zugegeben, die Skizzierung war etwas unscharf. Ich meinte: Gib mir den Dictionaryentry zurück, dessen Key 'Address' = 0x2c ist (zweiter Eintrag in den Daten)

Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Dienstag 20. Oktober 2020, 22:20
von __blackjack__
@Krischu: Und was genau hindert Dich daran? Der Wert zu einem Schlüssel kann alles Mögliche sein, beispielsweise auch ein Tupel mit Informationen zum Schlüssel.

Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Mittwoch 21. Oktober 2020, 06:36
von Krischu
__blackjack__ hat geschrieben: Dienstag 20. Oktober 2020, 22:20 @Krischu: Und was genau hindert Dich daran? Der Wert zu einem Schlüssel kann alles Mögliche sein, beispielsweise auch ein Tupel mit Informationen zum Schlüssel.
Was mich daran hindert, ist im Moment der Mangel an Kenntnis, wie man Dictionary-Einträge strukturiert.
Hier ist mein erster Versuch:

Code: Alles auswählen

syms={}

#data=[[00000010  A TCBlength],
#      [0000002c  A  TSAlength],
#      [10000934  B  Dstack],
#      [1000040c  B  ExcFrame],
#      [00001c8e T warm],
#      [00001a78 T zero]]

with open("./data.txt") as f:
    for line in f:
        (address, t, name) = line.split(' ')
        syms[int(address,16)] = (val, name)
​
print (syms)
print (syms[44][1])
-------------------
{16: ('T', 'TCBlength\n'), 44: ('T', 'TSAlength\n'), 268437812: ('T', 'Dstack\n'), 268436492: ('T', 'ExcFrame\n'), 7310: ('T', 'warm\n'), 6776: ('T', 'zero\n')}
TSAlength

Zu den obigen Zeilen ist mir noch nicht klar:

1. ist 'val' ein reserviertes Symbol?
2. wie strukturiere ich das Dictionary derart, daß "address" mein "key" ist und "type" und "name" die Werte, die ich unter "key" nachschlagen kann?

Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Mittwoch 21. Oktober 2020, 07:51
von Krischu
Korrektur: mein Programm sieht jetzt so aus: (konnte meinen Beitrag nicht mehr editieren.)

Code: Alles auswählen

syms={}

#data=[[00000010  A TCBlength],
#      [0000002c  A  TSAlength],
#      [10000934  B  Dstack],
#      [1000040c  B  ExcFrame],
#      [00001c8e T warm],
#      [00001a78 T zero]]

with open("./data.txt") as f:
    for line in f:
        (address, type, name) = line.split(' ')
        syms[int(address,16)] = (name,type)

print (syms)

print (syms[44][0])

-----------------------------------
{16: ('TCBlength\n', 'A'), 44: ('TSAlength\n', 'A'), 268437812: ('Dstack\n', 'B'), 268436492: ('ExcFrame\n', 'B'), 7310: ('warm\n', 'T'), 6776: ('zero\n', 'T')}
TSAlength


Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Mittwoch 21. Oktober 2020, 07:53
von sparrow
@Krischu

1. nein. Wie kommst du darauf? Aber val ist ein schlechter Name. So wie syms. Man sollte Namen immer ausschreiben, damit auch jeder Leser (auch du) weiß, dass es sich um symbionds handelt.
2. Das ist doch genau das, was du tust?

Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Mittwoch 21. Oktober 2020, 07:59
von Sirius3
1. `val` kommt von irgendwoher, wo Du es vorher definiert hast. Ich denke Du wolltest `t` verwenden.
2. Das ist doch das Ergebnis das Du bereits hast.

Code: Alles auswählen

with open("./data.txt") as lines:
    splitted_lines = map(str.split, lines)
    symbols = {int(address, 16): (type, name)
        for address, type, name in splitted_lines
    }

Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Mittwoch 21. Oktober 2020, 08:01
von Krischu
sparrow hat geschrieben: Mittwoch 21. Oktober 2020, 07:53 @Krischu

1. nein. Wie kommst du darauf? Aber val ist ein schlechter Name. So wie syms. Man sollte Namen immer ausschreiben, damit auch jeder Leser (auch du) weiß, dass es sich um symbionds handelt.
2. Das ist doch genau das, was du tust?
zu 1. Kannst Du mal kurz erklären, was ein Symbiont in diesem Zusammenhang ist?
zu 2. Ja, im zweiten Post habe ich es ja korrigiert.

Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Mittwoch 21. Oktober 2020, 09:03
von sparrow
@Krischu: Das mit den Symbionts weiß ich doch nicht. Du hast doch die Variable syms genannt. Und das steht doch für Symbionts? Das ist der Hinweis, dass man keine Abkürzungen verwendet.

Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Mittwoch 21. Oktober 2020, 10:57
von Krischu
sparrow hat geschrieben: Mittwoch 21. Oktober 2020, 09:03 @Krischu: Das mit den Symbionts weiß ich doch nicht. Du hast doch die Variable syms genannt. Und das steht doch für Symbionts? Das ist der Hinweis, dass man keine Abkürzungen verwendet.
Ach so. Ich dachte, jetzt käme etwas Besonderes. syms steht als Abkürzung für "symbols". Und das sagt *mir* genug. So wie "pics" für "pictures". Ich bin für knappe Namen.

Wunderte mich, daß "val" noch einen Wert hatte. Kann es sein, daß so eine Cell im Jupyter-Notebook/JupyterLab ein "Gedächtnis" hat?

Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Mittwoch 21. Oktober 2020, 11:13
von Sirius3
@Krischu: Eine Jupyter-Instanz hat ein Gedächtnis. Daher ist Jupyter nicht einfach zu bedienen. Da muß man sehr sorgfältig arbeiten, damit man reproduzierbare Ergebnisse erhält.

Re: Tabelle einlesen und als Dictionary speichern (CSV?)

Verfasst: Mittwoch 21. Oktober 2020, 13:05
von __blackjack__
@Krischu: Das Dir kryptische Abkürzungen genug sagen mag ja sein, aber Du zeigst den Code hier ja auch anderen. Und ich kann Dir aus Erfahrung sagen, das Abkürzungen die beim schreiben von Code sonnenklar waren, einem selbst Probleme machen können wenn man den eigenen Code ein halbes Jahr oder noch später wieder anfassen muss. Code wird wesentlich öfter gelesen als geschrieben, man sollte also keinen Wert auf möglichst knappes schreiben legen, sondern auf möglichst gute Lesbarkeit. Zudem: Was für Vorteile bringen knappe Namen? Speicher ist nicht mehr knapp und mehr Schreibarbeit ist das auch nur wenn man ungeeignete Werkzeuge verwendet.