Frage von Zombietot, 56

Kann jemand mir bei meinem Python Programm helfen?

Hey leute, ich bin zurzeit dabei ein kleines Python Programm zu schreiben, und habe jetzt folgende Fehlermeldung bekommen:

Traceback (most recent last call): in dieser Zeile kommt dann das Verzeichnis line 20 in (module) user_solution = int(user_solution) ValueError: invalid literal for int() with base: 10 '' was heißt das?

UND:

Kann mir jemand erklären, wie ich ein Dictionary dauerhaft speichern, und auslesen kann. (Auch wenn das Programm beendet ist.) Bitte beachten: ich bin absoluter Anfänger!

Antwort
von NoHumanBeing, 45

Die Fehlermeldung bedeutet, dass die Zeichenfolge, die in der Variable user_solution steht, nicht als Integer interpretierbar ist. Lass Dir user_solution doch an der Stelle einfach per print ausgeben, dann wirst Du sehen, was drin steht, was ihn "aus dem Tritt bringt".

Es gibt ein Äquivalent zu einem Dictionary, dass sich shelve nennt und das persistiert. Ansonsten kannst Du vermutlich ein Dictionary auch pickle-n.

Bitte beachte, dass sowohl shelve, als auch pickle dahingehend unsicher sind, dass sie die Ausführung von beliebigem Code durch das Objekt, das "ge-un-pickle-d" (also von der persistenten Repräsentation in ein Python-Objekt zurückverwandelt) wird, erlauben. Wenn Dein Dictionary keine komplexen Objekte, sondern beispielsweise nur Strings als Werte enthält, solltest Du Dein eigenes "pickle-Äquivalent" entwickeln, welches sicher ist, etwa auf Basis des csv-Moduls.

Kommentar von Zombietot ,

Und jetzt nochmal fuer noobs, ok? :D

Langsam mit der jungen Lasagne


Kommentar von NoHumanBeing ,

Ok, ich versuch's. Man kann nicht jede beliebige Zeichenfolge (oder gar jedes beliebige Objekt) in einen Integer umwandeln. Die Fehlermeldung bedeutet, dass Du an die int-Funktion etwas übergeben hast, das sie nicht in einen Integer umwandeln kann.

Zur Veranschaulichung eine Interpreter-Sitzung in Python (einfach "python" in der Konsole eingeben öffnet den Interpreter). Die fett gedruckten Dinge sind meine Eingaben, der Rest sind Ausgaben des Interpreters.

>>> int("320")
320
>>> int("")
Traceback (most recent call last):
File "", line 1, in
ValueError: invalid literal for int() with base 10: ''
>>> int("320.0")
Traceback (most recent call last):
File "", line 1, in
ValueError: invalid literal for int() with base 10: '320.0'
>>> int("0123")
123
>>>

Wie Du siehst, kannst Du beispielsweise keinen leeren String übergeben oder keine Kommazahl, da sonst der Fehler kommt. So etwas wird bei Dir im Code irgendwo passieren. Füge, bevor Du die Umwandlung durchführst, eine Ausgabe mittels print-Befehl (falls Du in Python 2.x entwickelst) bzw. print-Funktion (falls Du in Python 3.x entwickelst) ein. Dann gibt Dir dein Programm auf der Konsole aus, was in der Variable user_solution jeweils steht.

In Python 2.x:

print user_solution

In Python 3.x:

print(user_solution)

Du kannst die print-Variante aus Python 3.x auch in Python 2.x verwenden, indem Du sie vorher explizit importierst.

from __future__ import print_function

Das benutze ich recht häufig (zusammen mit "from __future__ import division", das das Verhalten des Divisionsoperators aus Python 3.x in Python 2.x "importiert"), da ich möchte, dass mein Code sowohl auf Python 2.x, als auch auf Python 3.x funktioniert und das einen Großteil der Unterschiede "erschlägt".

Daten persistieren kann ich nicht wirklich "für Noobs" erklären, weil es schon eine ziemlich anspruchsvolle Sache ist. Es gibt Module namens pickle und shelve, die eine sehr "primitive" (und nicht sichere!) Möglichkeit der Serialisierung (*) bieten.

(*) https://de.wikipedia.org/wiki/Serialisierung

Aus diesem Grund sollte man pickle und shelve (oder allgemein "unspezifische Serialisierungsmethoden", d. h. solche, die mit beliebigen Objekten umgehen können) eigentlich nicht benutzen, sondern für jede Datenstruktur, die man im Programm verwendet, selbst eine Repräsentation entwickeln, wie man sie in einer (Text- oder Binär-)Datei repräsentieren könnte und die Umwandlung selbst vornehmen.

Das kann ich hier aber nicht "von Null auf" erklären. Du musst unter Umständen Deine Anwendung und Datenstruktur auch so entwerfen, dass man sie überhaupt vernünftig serialisieren kann. Zyklische Abhängigkeiten (ein Objekt zeigt auf ein anderes, das wieder zurück auf das erste zeigt) kann man beispielsweise quasi nicht (d. h. nur mit enormem Aufwand) überhaupt serialisieren (und somit kann man sie auch nicht persistieren, d. h. in einer Datei ablegen).

Du merkst, das ist schon sehr speziell. Da müsstest Du Dich eingehender mit Algorithmen und Datenstrukturen befassen. Wenn Dein Dictionary als Werte (ein Dictionary enthält ja Paare aus Schlüssel und Wert) nur Strings (Zeichenfolgen) enthält, bietet sich eine Repräsentation in Form einer CSV-Datei an (CSV = comma-separated-values).

Keine passende Antwort gefunden?

Fragen Sie die Community