Error bei Wörterbuch

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
Dödelmann
User
Beiträge: 1
Registriert: Donnerstag 6. Oktober 2022, 17:19

Guten Tag,

ich möchte aus einer Textdatei ein Wörterbuch erzeugen.
ich habe folgendes Problem:

woerter = {}

with open("C:\\Users\\jonat\\OneDrive\\Desktop\\Python\\Wörter.txt", "r") as fobj:
for line in fobj:
zuordnung = line.split(" ")
woerter = [zuordnung[0]] = zuordnung[1]


Traceback (most recent call last):
File "C:\Users\jonat\PycharmProjects\Datei auslesen etc..py", line 15, in <module>
woerter = [zuordnung[0]] = zuordnung[1]
ValueError: too many values to unpack (expected 1)


Meine Textdatei enthält gleich viele Werte wie Schlüssel:

Australia Australien
France Frankreich
Germany Deutschland

Habe schon etwas gegoogelt,
das Problem ist vermutlich dass Python Wert und Schlüssel zusammen als ein Tuple behandelt. Mit der .items() Methode funktioniert es nicht,
die funktioniert nicht bei strings und das Wörterbuch enthält die zu trennenden Schlüssel und Werte noch nicht.
Stehe komplett auf dem Schlauch und bin für jede Hilfe dankbar. :mrgreen:
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Es sieht so aus, als sollte `woerter = [zuordnung[0]] = zuordnung[1]` eigentlich `woerter[zuordnung[0]] = zuordnung[1]` sein. Dein Code hat keinen wirklichen Sinn. Mit der Änderung weist du dem Schlüssel zuordnung[0] den Wert zuordnung[1] zu.
Benutzeravatar
__blackjack__
User
Beiträge: 13063
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dödelmann: Ergänzend zu der Antwort von /me: Wenn Du den Quelltext im Beitrag in Code-Tags packst, bleibt die Einrückung in der Anzeige erhalten, was ja bei Python wichtiger Bestandteil der Syntax ist.

Beim öffnen von Textdateien sollte man immer explizit die Kodierung angeben in der die Daten gespeichert sind/gespeichert werden sollen. Wenn man das selbst in der Hand hat, bietet sich UTF-8 an, weil das alle Unicode-Zeichen (de)kodieren kann.

`fobj` ist ein komischer Name. Namen sollten keine kryptischen Abkürzungen enthalten, wie hier `f` was wohl für `file` stehen soll, und `obj` das wohl für `object` stehen soll ist unnötig. In Python ist *alles* was man an einen Namen binden kann ein Objekt. Da im Namen noch mal sagen, dass es sich um ein Objekt handelt ist also keine Information die dem Leser einen Mehrwert liefert. Also wäre das einfach nur `file`. Oder, da es als iterierbares Objekt über Zeilen verwendet wird, könnte man es auch `lines` nennen.

Indexzugriffe mit ”magischen” Zahlen sind nicht so wirklich schön zu lesen. Statt einen Namen `zuordnung` und dann mit 0 und 1 auf die beiden Teile zuzugreifen, wäre es besser lesbar, wenn man das Ergebnis von `split()` gleich an zwei aussagekräftigere Namen zuweist:

Code: Alles auswählen

        woerter = {}
        for line in lines:
            schluessel, wert = line.split(" ")
            woerter[schluessel] = wert
Die Zeilen in der Datei werden mit einem Zeilenendezeichen abgeschlossen, was im Moment noch Teil der Werte ist. Das willst Du ziemlich sicher entfernen.

Letztlich kann man es aber auch massiv vereinfachen, weil man Wörterbücher auch erstellen kann in dem man `dict()` mit einem iterierbaren Objekt aufruft, das Schlüssel/Wert-Paare liefert. Damit wird das zu einem einzigen Ausdruck. Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    with open(
        R"C:\Users\jonat\OneDrive\Desktop\Python\Wörter.txt",
        "r",
        encoding="utf-8",
    ) as lines:
        woerter = dict(line.rstrip().split(" ") for line in lines)


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten