stringreihe in dict wandeln

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
oldboyJR
User
Beiträge: 33
Registriert: Donnerstag 28. März 2024, 16:19

diese Reihe liegt als str in der Variablenliste: {"Wert1": "10", "Wert2": "50", "Wert3": "80"}
wie kann man das in eine dict wandeln?
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist eine Variablenliste? Warum ist das ein String? Woher kommt der?
Sieht aus wie JSON, also hilft json.loads.
Benutzeravatar
__blackjack__
User
Beiträge: 13135
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@oldboyJR: Was ist eine „Variablenliste“ in diesem Kontext? Falls das was da steht in einer Zeichenkette vorliegt, dann ist das JSON und kann mit dem `json`-Modul aus der Standardbibliothek geparst werden:

Code: Alles auswählen

In [132]: text = '{"Wert1": "10", "Wert2": "50", "Wert3": "80"}'

In [133]: import json

In [134]: data = json.loads(text)

In [135]: data
Out[135]: {'Wert1': '10', 'Wert2': '50', 'Wert3': '80'}

In [136]: type(data)
Out[136]: dict

In [137]: data["Wert1"]
Out[137]: '10'
Um zu klären ob das *immer* geht, oder nur mit diesem Beispiel, müsste man wissen ob das wirklich JSON ist, oder nur zufällig *auch* gültiges JSON ist.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
oldboyJR
User
Beiträge: 33
Registriert: Donnerstag 28. März 2024, 16:19

Ich habe ein wenig probiert und habe folgendes Listing:

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 25 11:01:27 2024

@author: GBT B650M GamingX AX
"""
import io
#with open("ausgabe.txt", "r") as f:
#    print(f.read())
# Schreiben
Wert1 = 10
Wert2 = 50
Wert3 = 80
wert1 = str(Wert1)
wert2 = str(Wert2)
wert3 = str(Wert3)
s =  '{"Wert1": '+'"'+str(wert1)+'"'+',\n"Wert2": '+'"'+ str (wert2)+'"'+',\n "Wert3": '+'"'+str(wert3)+'"}'

      
with open("arg7.txt", "w") as f:
    f.write(s)
f.close()

ich hatte nun gehofft das ich damit eine Dictionary beim lesen erhalte. Aber es ist ein langer String
Nun manchmal gibt es Irrtümer und nicht mehr aktuelle LIstings aber dank deiner Antwort habe ich meine Lesebaustein vervollständigt.

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 25 00:53:35 2024

@author: GBT B650M GamingX AX
"""
import json
with open("arg7.txt", "r") as f:
    s = (f.read())
    data = json.loads(s)
    print (data)
Nun gibt es eine Möglichkeit mehr ein dict in eine txt zu schreiben und zu lesen.
Der allgemeine Zweck ist sich den Umweg über Framwork und Co für den Anfänger zu sparen.
Entweder man baut sich sowas wie eine globale Variable oder Classe (gefährlich)die von überall erreichbar ist oder man benutzt framworks und co zum hineinschreiben die dann ebenfals von überall her eingelesen und zurückgeschrieben werden kann (ich nenne es mal virtuell Global) denn werden die so erzeugten Windows geschlossen werden existieren sie nicht mehr Das schreiben in eine Datei macht die werte persistent.
In eurer Sammlung viewtopic.php?p=37898&hilit=Datenspeich ... hon#p37898 hatte ich mir alle angesehen und heute morgen nochmals das pickle modul vorgenommen. Mit dem ich zuvor nicht klar gekommen bin. Ich glaube da gab es ein update welches nicht berücksichtigt wurde bzw. welches das schreiben und lesen von dict erleichtert

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
#!/usr/bin/env python

#Schreibt ein dict in eine Datei .bin
import pickle
from pathlib import Path
# Schreiben

s = {"Wert1": "dat1",
     "Wert2": "dat2",
     "Wert3": "dat3",
     "Wert4": "dat4",
     "Wert5": "dat5",
     "Wert6": "dat6"
     }
print(s)
a = 50 # diese Zeile habe ich eingefügt um zu zeigen das man einen Wert aus dem Programm
s["Wert1"] = str(a)#in einen Wert eines dict überführen kann
print(s)
path = Path.home() / "ad.bin"
with path.open("wb") as f:
    pickle.dump(s, f)
    f.close()
wie man sieht ist die eckige Klammer nicht mehr nötig und zum lesen:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
#!/usr/bin/env python
"""
Created on Wed Apr 24 12:43:45 2024

@author: GBT B650M GamingX AX
"""
import pickle

from pathlib import Path

path = Path.home() / "ad.bin"
with path.open("rb") as f:
    s = pickle.load(f)
    print(s)
    print(s['Wert1'])
    
Benutzeravatar
sparrow
User
Beiträge: 4202
Registriert: Freitag 17. April 2009, 10:28

Und alle Hinweise auf JSON ignorierst du und gehst diesen komplizierten Weg, weil?
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

oldboyJR hat geschrieben: Donnerstag 25. April 2024, 23:35 Ich habe ein wenig probiert und habe folgendes Listing:

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 25 11:01:27 2024

@author: GBT B650M GamingX AX
"""
import io
#with open("ausgabe.txt", "r") as f:
#    print(f.read())
# Schreiben
Wert1 = 10
Wert2 = 50
Wert3 = 80
wert1 = str(Wert1)
wert2 = str(Wert2)
wert3 = str(Wert3)
s =  '{"Wert1": '+'"'+str(wert1)+'"'+',\n"Wert2": '+'"'+ str (wert2)+'"'+',\n "Wert3": '+'"'+str(wert3)+'"}'

      
with open("arg7.txt", "w") as f:
    f.write(s)
f.close()

Du importierst io, benutzt es aber nicht. Variablennamen nummeriert man nicht durch und schreibt sie komplett klein. Was ist der Unterschied zwischen `Wert1` und `wert1` und wie soll das jemand, der den späteren Programmcode liest, unterscheiden? Warum wandelst Du Strings nochmal in Strings um? Strings setzt man nicht mit + zusammen, sondern benutzt f-Strings. Das close ist bei Benutzung von with überflüssig.
Es bleibt also:

Code: Alles auswählen

wert1 = 10
wert2 = 50
wert3 = 80
text = f'{{"Wert1": "{wert1}",\n"Wert2": "{wert2}",\n"Wert3": "{wert3}"}}'
with open("arg7.txt", "w", encoding="utf8") as output:
    output.write(text)
Wenn Du aber eigentlich ein Wörterbuch haben möchtest, warum startest Du dann nicht gleich mit einem Wörterbuch?

Code: Alles auswählen

werte = {
    "Wert1": "10",
    "Wert2": "50",
    "Wert3": "80"
}
text = "{%s}" % ",\n".join(f'"{key}": "{value}" for key, value in werte.items())
with open("arg7.txt", "w", encoding="utf8") as output:
    output.write(text)
Wenn Du aber eigentlich ein Format haben möchtest, das man auch einfach wieder Lesen kann, dann benutzt man json:

Code: Alles auswählen

werte = {
    "Wert1": "10",
    "Wert2": "50",
    "Wert3": "80"
}
with open("arg7.txt", "w", encoding="utf8") as output:
    json.dump(werte, output)
Pickle ist ein Python-Internes Format, um kurzzeitig vertrauenswürdige Datenstrukturen zu speichern, es ist nicht für Konfigurationen, also längerfristige Speicherung geeignet.
Antworten