Tabelle einlesen und als Dictionary speichern (CSV?)

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
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

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.
--
Grüße
Christoph
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

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)
Zuletzt geändert von Krischu am Dienstag 20. Oktober 2020, 22:25, insgesamt 1-mal geändert.
--
Grüße
Christoph
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

__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?
--
Grüße
Christoph
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

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

--
Grüße
Christoph
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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?
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

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
    }
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

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.
--
Grüße
Christoph
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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.
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

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?
--
Grüße
Christoph
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten