Neuling sucht Rat

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.
BlackJack

@Tengel: Definiere „nötig”. Man kann das benutzen um (serialisierbare) Python-Objekte in eine Datei zu schreiben und daraus zu lesen. Also auch für Zahlen. Man könnte auch einfach eine Textdatei verwenden für eine einzelne Zahl. Hätte den Vorteil, dass die Datei unabhängig von der Programmiersprache ist und die Zahl in jedem Texteditor einfach und verständlich lesbar ist.

Code: Alles auswählen

#!/usr/bin/env python


def main():
    filename = 'test.txt'
    try:
        with open(filename) as lines:
            number = int(next(lines))
    except EnvironmentError:
        number = 0
    number += 42
    with open(filename, 'w') as number_file:
        number_file.write('{0}\n'.format(number))
        

if __name__ == '__main__':
    main()
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Hm wie gesagt
ich möchte einen "alten" Wert auslesen und diesen mit einer Benutzereingabe addieren ...und denn neuen Wert speichern .....aber ich versuchs jetzt ewig und es will einfach nicht ...langsam zweifel ich wirklich an meinem Verstand.

Neuen Verbrauch eingeben: 4
Traceback (most recent call last):
File "D:/Phyton/probe traffic.py", line 16, in <module>
print(gesamtverbrauch)
NameError: name 'gesamtverbrauch' is not defined
>>> ================================ RESTART ================================
>>>
Neuen Verbrauch eingeben: 4
4
>>> ================================ RESTART ================================
>>>
Neuen Verbrauch eingeben: 6
6
>>> ================================ RESTART ================================
>>>
Neuen Verbrauch eingeben: 4
4
>>> ================================ RESTART ================================
>>>

Neuen Verbrauch eingeben:

>>>
>>> ================================ RESTART ================================
>>>

Neuen Verbrauch eingeben: 4
4
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "D:/Phyton/probe traffic.py", line 8, in <module>
alterTraffic = pickle.load(d)
TypeError: 'str' does not support the buffer interface
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "D:/Phyton/probe traffic.py", line 8, in <module>
alterTraffic = pickle.dump(d)
TypeError: Required argument 'file' (pos 2) not found
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "D:/Phyton/probe traffic.py", line 9, in <module>
alterTraffic = pickle.dump(d,alterInhalt)
TypeError: file must have a 'write' attribute
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "D:/Phyton/probe traffic.py", line 9, in <module>
alterTraffic = pickle.load(d,alterInhalt)
TypeError: pickle.load() takes exactly one positional argument (2 given)
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "D:/Phyton/probe traffic.py", line 9, in <module>
alterTraffic = pickle.load(d)
TypeError: 'str' does not support the buffer interface
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "D:/Phyton/testa.py", line 6, in <module>
pickle.dump(d,alterWert)
TypeError: file must have a 'write' attribute
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "D:/Phyton/testa.py", line 6, in <module>
pickle.dump(d,alterWert)
TypeError: file must have a 'write' attribute
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "D:/Phyton/probe traffic.py", line 9, in <module>
alterTraffic = pickle.load(alterInhalt, d)
TypeError: pickle.load() takes exactly one positional argument (2 given)
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "D:/Phyton/probe traffic.py", line 9, in <module>
alterTraffic = pickle.dump(alterInhalt, d)
TypeError: must be str, not bytes


So sieht meine Shell aus >.< und die paar male wo kein Fehler kam hat er die Werte nicht addiert oder ggf. erst nach der Eingabe den Fehler gebracht.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ich weiß nicht was ich jetzt schon alles für "Varianten" versucht hab.

aber etwas etwa wie

print(int(alterwert)+4)

und es kam das richtige Ergebnis raus war wohl am nächsten dran :(
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Und wen ich deinen/Ihren Text sehe würde ich es am liebsten schon wieder hin schmeißen weil ich nicht mal die Hälfte davon kenne.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Tengel hat geschrieben:Und wen ich deinen/Ihren Text sehe würde ich es am liebsten schon wieder hin schmeißen weil ich nicht mal die Hälfte davon kenne.
Dann gehe den Code von BlackJack einfach Stück für Stück durch und teste die Einzelteile. Dann siehst du doch was passiert. Ist doch gerade einer der Vorteile von Python, dass das so einfach geht.
Das Leben ist wie ein Tennisball.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Code: Alles auswählen

import sys


    

class Traffic():
    def ursprungsWert(self):
        d = open("traffic.txt")
        ursprungsWert=d.readline()
        d.close()
        print("Bisheriger Verbrauch liegt bei",ursprungsWert,"mb")
    def aktuellerWert(self,):
        neuerWert= input("Wieviel wurde verbraucht: ")
        try:
            neuerWert=int(neuerWert)
        except:
            print("Falsche Eingabe")
        aktuellerWert= neuerWert+ursprungsWert
        print("Der momentane Verbrauch liegt bei",aktuellerWert,"mb")
        aktuellerWert= str(aktuellerWert)
        d = open("traffic.txt","w")
        d.write(aktuellerWert)
        d.close()
        
    def resetten(self):
        d = open("traffic.txt","w")
        d.write("0")
        d.close()
        
#Hauptprogramm
traffic=Traffic()



#Menü


while True:
    
    d = open("traffic.txt")
    ursprungsWert=d.readline()
    ursprungsWert= int(ursprungsWert)
    d.close()


    print("Menü")
    print("1: bisherigen Verbrauch anzeigen")
    print("2: neuen Verbrauch eingeben")
    print("3: momentanen Stand zurücksetzen")
    print("4: Beenden")

    auswahl = input("Ihre Auswahl: ")
    try:
        auswahl = int(auswahl)
        

    except:
        print("Falsche Eingabe")
        print()
        continue
    
    print()
    if auswahl == 1:
        traffic.ursprungsWert()
        print()
        
    elif auswahl == 2:
        traffic.aktuellerWert()
        monatsWerte(aktuellerWert)
        print()
        
    elif auswahl == 3:
        print("Möchten sie den aktuellen Stand wirklich zurück setzen?")
        print("1: ja")
        print("2: nein")
        entscheidung = input()
        try:
            entscheidung = int(entscheidung)
        except:
            print("Falsche Eingabe")
            print()
            
        if entscheidung == 1:
            traffic.resetten()
            print()
            
        elif entscheidung ==2:
            print()
            continue
        
        else:
            print("Falsche Eingabe")
            print()

            
    elif auswahl == 4:
        break
    else:
        print("Bitte eine Zahl von 1-4 eingeben")
        print()
        




So jetzt scheint es zu funktionieren .....der Fehler war anscheinend ...das ich w+ genommen hab ....ich dachte das macht das selbe wie w aber man kann damit auch lesen hmmmmm.

Code: Alles auswählen


def monatsWerte(aktuellerWert):
    gesamt= 10
    gb    = 1024
    VerbrauchInGB = aktuellerWert/1024
    VerbbrauchInProzent = 100/10*VerbrauchInGB
    print("Momentaner verbrauch entspricht: ",VerbrauchInGB,"gb.")
    print("Das bedeutet es wurden bereits ",VerbrauchInProzent,"% verbraucht.")

Die Funktion habe ich noch geschrieben die müsste auch laufen wenn ich der Funktion aktuellerWert der Klasse Traffic ein return hinzu füge - das Problem ist ich müsste aktuellerWert wieder in int umwandeln ...und ich bezweifel das es so gesund ist das mehrmals hin u herzuwechseln.

Naja - immerhin läuft es ...und das waren 2 Gebiete wo ich noch nicht so wirklich sicher bin in den Basics(Klassen, Daten(speichern,laden))
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Tengel,

Programmieren ist keine Ratespielm eher wie Kuchenbacken. Wenn man die Zutaten richtig vermengt kann man den Teig in den Ofen schieben (das Programm ausführen) und zum Schluss kommt ein leckerer Kuchen raus. Wenn man sich an ein Grundrezept hält, kommt erst mal etwas Essbares raus, danach kann man immer noch verfeinern (oh, mehr Kakao).
Deine Versuche sehen mehr danach aus, als ob Du mal zufällig die Eier aufgeschlagen hast, statt sie einfach in der Schale ins Mehl zu legen und schon sieht eine Ecke aus wie Kuchen, der Rest ist aber noch ungenießbar.
Die wirst keinen noch so langjährigen Programmierer finden, der ein Programm, ab einer bestimmten Komplexität, einfach so herunterschreibt und es funktioniert. Deshalb testen wir kleine Komponenten, ob sie auch das Tun, was wir von ihnen Wollen und setzten diese kleinen Teile zu etwas Größerem zusammen.
Dazu muß man aber den kleinen Teilen eine konkrete Aufgabe gegeben.
Es hilft, sich erstmal einen Plan zu machen:
1. ich will ein Programm, das den Traffic zählt.
2. es soll können:
- Verbrauch eingeben
- Gesamtverbrauch berechnen
- Gesamtverbrauch in Datei schreiben/lesen
- ein schönes Menü haben

Exemplarisch mache ich das mal am ersten Punkt:
Eingeben geht mit Input:

Code: Alles auswählen

verbrauch = input("Wieviel wurde verbraucht:")
print verbrauch
oh sehr gut, funktioniert. Ach nein, ich brauche ja eine Zahl:

Code: Alles auswählen

verbrauch = int(input("Wieviel wurde verbraucht:"))
print verbrauch
funktioniert. Außer ich gebe gar keine Zahl ein ;-(
Also Fehler abfangen:

Code: Alles auswählen

try:
    verbrauch = int(input("Wieviel wurde verbraucht:"))
except ValueError:
    print("Bitte Zahl eingeben!")
print verbrauch
Jetzt kommt bei Falscheingabe ein Fehler, dass er verbrauch nicht kennt.
Aber da ich nur diese paar Zeilen und nicht das ganze Programm am Stück anschaue weiß ich auch, dass der Fehler irgendwo hier drin stecken muß. Wäre das Programm komplexer und ich würde schon vorher irgendwo »verbrauch« definieren, würde ich mich wundern, warum er jetzt einen „falschen“ Wert benutzt, könnte aber nicht mehr herausfinden woher der kommt.

Also was soll dann passieren? Er soll nochmal nachfragen:

Code: Alles auswählen

while True:
    try:
        verbrauch = int(input("Wieviel wurde verbraucht:"))
        break
    except ValueError:
        print("Bitte Zahl eingeben!")
print verbrauch
Ja jetzt kann er auch mit falschen Eingaben umgehen. Packen wir das ganze doch in eine Funktion:

Code: Alles auswählen

def input_verbrauch():
    while True:
        try:
            return int(input("Wieviel wurde verbraucht:"))
        except ValueError:
            print("Bitte Zahl eingeben!")
verbauch = input_verbrauch()
print verbrauch
Diese Funktion ist jetzt getestet, und tut genau das was ich will. Ich kann sie nun benutzen und muß mich um Details, wie die Eingabe wiederholt oder in eine Zahl umgewandelt wird, nicht mehr kümmern.
Das kann ich jetzt mit allen anderen Punkten auf meiner Liste genauso machen.

Auch wenn es hart ist, würde ich Dir empfehlen, nochmal von vorne anzufangen und alles aus getesteten Komponenten aufzubauen, denn dein Programm tut vielleicht, aber es macht nicht das, was Du beabsichtigt hast, dass es tut.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ich bin verwirrt.......und frustriert.

Ich kann nur sagen das ich es genauso gemacht hab - wenn auch etwas umständlicher da ich die einzelnen Funktionen je in einem "extra" Fenster geschrieben - gestestet und dann im "Hauptfenster zusammen gesetzt hab.

Irgendwie ...weiß ich grad echt nich was ich von allem halten soll.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ich könnt zwar grad heulen ...hab mich gestern/heut nacht noch so gefreut weil das mit Klasse und Daten funktioniert hat ...aber (noch) geb ich mich nicht geschlagen - also geh ichs nochmal durch.

Code: Alles auswählen


import sys

class Traffic():
    def ursprungsWert(self):
        d = open("testtraffic.txt")
        ursprungsWert = d.readline()
        d.close()
        print("Bisheriger Verbraucht liegt bei: ",ursprungsWert,"mb")


#Haupt
traffic=Traffic()

traffic.ursprungsWert()



Dafür wurde noch die testtraffic.txt mit 5 erstellt - das print gibt 5 aus - funktioniert

Code: Alles auswählen

def aktuellerWert(self):

        try:
            neuerWert=int(input("Wieviel wurde verbraucht: "))
        except ValueError:
            print("Bitte Zahl eingeben!")

        print(neuerWert)


Es wird der Wert - der eingegeben wurde ausgeben - funktioniert

Code: Alles auswählen

       aktuellerWert = neuerWert+ursprungsWert
        print("Der momentane Verbrauch liegt bei",aktuellerWert,"mb")

addiert die beiden Werte - funktioniert - aber nicht "eigenständig" dafür wurde

Code: Alles auswählen

d = open("testtraffic.txt")
    ursprungsWert=d.readline()
    ursprungsWert= int(ursprungsWert)
    d.close()
am Programmanfang aufgerufen

Code: Alles auswählen

def resetten(self):
        d = open("testtraffic.txt","w")
        d.write("0")
        d.close()
setzt auf 0 zurück - print liefert 0 funktioniert

Die einzelnen Teile funktionieren in meinen Augen alle wie sie sollen.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

class Traffic():
    def ursprungsWert(self):
        d = open("testtraffic.txt")
        ursprungsWert = d.readline()
        d.close()
        print("Bisheriger Verbraucht liegt bei: ",ursprungsWert,"mb")
diese Funktion hat nichts mit der Klasse Traffic zu tun, den gleichen Code hast Du später nocheinmal um ursprungsWert zu lesen und dann in ein int zu verwandeln. Also warum dann hier nochmal? Die Funktion funktioniert nicht wenn
- die Datei testtraffic.txt nicht existiert
- wenn die Datei leer ist

Code: Alles auswählen

def aktuellerWert(self):
        try:
            neuerWert=int(input("Wieviel wurde verbraucht: "))
        except ValueError:
            print("Bitte Zahl eingeben!")
        print(neuerWert)
wieder eine Funktion die nichts mit der Traffic-Klasse macht, also raus aus der Klasse.
Die Funktion tut nicht, wenn keine Zahl eingegeben wird. Die Funktion macht auch sonst nicht das was sie verspricht, denn ich kann den Wert der eingegeben wird nicht weiterverwenden.

Code: Alles auswählen

d = open("testtraffic.txt")
    ursprungsWert=d.readline()
    ursprungsWert= int(ursprungsWert)
    d.close()
Datei Lesen ist schon in Traffic.ursprungsWert implementiert, hier nochmal, warum?
Die Zeilen tun nicht wenn:
- die Datei nicht exisitiert
- die Datei leer ist
- keine Zahl in der ersten Zeile steht


Die Funktion resetten hat keinen Bezug zur Klasse Traffic, was soll sie da drin? Sie hat keine Fehlerbehandlung falls die Datei nicht geschrieben werden kann.

Zusammenfassend: Keine Funktion (außer resetten) tut das, was sie verspricht. Alle Funktionen tun zuviel, kommen woanders doppelt vor, vermischen Eingabe/Ausgabe/Verarbeitung, haben zum Teil unerwartete Nebeneffekte.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Zusammenfassend: alles ist falsch und ich sollts einfach lassen -.-
ka. ich dachte ich nutze die Klasse Traffic einfach dafür um verschiedene Funktionen die mit "traffic" zu tun haben zusammenzufassen - und um einach mal mit Klassen was zu machen
Naja thx für die Hilfe
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo Tengel,
ich hab mittlerweile 3x "angefangen" Python zu "programmieren". Aus Zeitgründen und da ich offenbar für manche Dinge länger brauche, um sie zu verstehen (das soll jetzt nicht bedeuten, dass man für irgendetwas zu blöd ist) bin ich bislang nicht wirklich vom Fleck gekommen. Mir fehlte es -abgesehen von der Zeit- an eigenen Ideen, um mich zu motivieren etwas zu programmieren. Ich finde es ab und zu recht schwierig, das richtige Modul für eine Aufgabe ausfindig zu machen und dieses Modul dann auch korrekt einzusetzen. Es könnnten hier noch einige meiner Probleme folgen, aber das ist jetzt nicht das Thema ;-)

Bis man das alles möglichst gut intus hat, dauert es vermutlich Jahre. Erst dann wird man "einfach so" ein Programm aus dem Ärmel schütteln können.

Nun zu deinem letzten Post:
Hier sind sehr kompetente Pythonleute unterwegs, die einem mit Rat und Tat zur Seite stehen und noch dazu immer sehr freundlich sind. Manche Antworten der Profis desillusionieren den Anfänger, denn man kommt in eine Situation, in der man als Beginner das Gefühl bekommmt, dass man es einfach nicht auf die Reihe kriegt. Das geschieht meiner Meinung nach deshalb, da hier dann u.U. eine optimale Lösung angestrebt wird. Das ist gut und richtig so, denn man will ja keinen Blödsinn lernen. (einmal Manifestiertes bekommt man schwer wieder los).

Ich habe das Gefühl, dass du bei deinenem Vorhaben, Python zu lernen, zu hohe Anforderungen an dich selbst stellst. (zu viele Infos in zu kurzer Zeit - du hast erst am 17.03.2013 damit angefangen!!).

Versuche es etwas langsamer anzugehen und dir ein fundiertes Grundwissen "anzulegen". Manche Dinge erklären sich dann von selbst ;-)

Lass dich nicht unterkriegen!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mcdaniels hat geschrieben:Bis man das alles möglichst gut intus hat, dauert es vermutlich Jahre. Erst dann wird man "einfach so" ein Programm aus dem Ärmel schütteln können.
Das stimmt. Habe ich hier schon Teach Yourself Programming in 10 Years verlinkt? Habe auch letztens festgestellt dass ich knapp 10 Jahre dabei bin, was mich selbst etwas überrascht hat weil ich mich gut dran erinnern kann wie ich Python angefangen hab, als wärs gestern gewesen :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

@Leonidas Ach, das waren noch Zeiten… kann mich noch gut daran erinnern, wie viel Überwindung es mich gekostet hat, von „ordentlichen“ Sprachen (so mit nur Klassen, public, private und anständig vielen Semikola, geschweiften Klammern, etc.) zu diesem komischen „Python“ zu wechseln… und auch nur, weil C# damals unter Linux faktisch nicht existent war :)
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo nochmals,
wenn ich mir anschaue, dass ich bereits seit 18.08.2010 hier registriert bin und mir faktisch eingesehen muss, dass ich nicht wirklich weiter gekommen bin... ich könnte mich dafür treten... ich hab ja leider - wie erwähnt - eine verdammt lange Leitung ...

...ja ich beneide euch Profis fast :-)

@TO: Deshalb nicht aufgeben und dran bleiben (ich weiß ich wiederhole mich).
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:@Leonidas Ach, das waren noch Zeiten… kann mich noch gut daran erinnern, wie viel Überwindung es mich gekostet hat, von „ordentlichen“ Sprachen (so mit nur Klassen, public, private und anständig vielen Semikola, geschweiften Klammern, etc.) zu diesem komischen „Python“ zu wechseln… und auch nur, weil C# damals unter Linux faktisch nicht existent war :)
:D Und überhaupt, das wird gar nicht in ein Binary kompiliert, wie C++, dieses "Python".
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Da werde ich die Kerbe noch weiter ausritzen ...

Eine Programmiersprache kann man in wenigen Tagen lernen.
Programmieren selber braucht Jahre. !0 Jahre sind auch recht knapp bemessen.

Python ist halt ein zweischneidiges Schwert. Es ist einfach zu lernen (Syntax) und doch sehr mächtig.

Ich vergleiche es gerne mit einem Werkzeugkasten: Wenn man einen Java-Werkzeugkasten über seinem Kopf ausschüttet, fällt einem ein (ziemlich schwerer) Maulschlüssel auf den Kopf (Klassen). Die Auswahl des passenden Werkzeuges fällt somit sehr leicht. Nunja, man muss den Maulschlüssel allerdings auch zum Nägeleinschlagen, Schraubendrehen, Luftbefeuchten und Kuchenbacken verwenden.

Ein Python-Werkzeugkasten wirft einem einen halben Baumarkt entgegen ...

Der Vorteil ist jedoch, dass man mit vielen Dingen herumexperimentieren kann (z. B. mit funktionaler Programmierung). Nur eben dieses braucht Zeit. Man muss lernen, wie ein Programmierer zu denken (Vorsicht: Wenn man den Bogen einmal raus hat, dann kann man nicht mehr anders; überall Datenstrukturen und Algorithmen, Perfektionismus, "das geht auch eleganter").

Wichtig: Pausen. Man darf das ganze auch mal zwei Tage liegen lassen (oder länger, wenn man dafür nicht bezahlt wird; mein Privileg). Manche Dinge muss man sich einfach schönsaufen ...

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Hmmm....

Zurück zum Thema - wie kann ich bei einem

Code: Alles auswählen



d = open("traffic.txt")
inhalt=d.readline()
d.close()





den abfangen? Falls es nicht vorhanden ist?
In meinem Buch wird das irgendwie während des ganzen Kapitels immer nur mit

Code: Alles auswählen


#Zugriffsversuch

try:
d = open("beispiel.txt")
except:
print("Zugriffsversuch nicht erfolgreich")
sys.exit(0)


behandelt.

Und im abschließenden beispiel am Spiel

Code: Alles auswählen

if not glob.glob("highscore.bin","rb")

Wobei ich meine mich dunkel zu erinnern das BlackJack? meinte er hätte das in dieser noch nie gesehen und fände es nicht gut.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Tengel,
immer wenn irgendwo ein Fehler auftritt wird eine Exception geworfen. Diese wird solange weitergereicht, bis jemand was damit anfangen kann. In Deinem Fall, wenn es Probleme mit der Datei gibt, ist es in Deinem Programmablauf vernünftig, den verbrauchten Traffic mit 0 anzunehmen. Alle Fehler die mit Dateien zu tun haben werden unter der Klasse EnvironmentError zusammengefasst. Es könnten noch andere Fehler auftreten, von denen Du nichts weißt, wo Du also auch nicht weißt, wie Du darauf reagieren sollst, deshalb läßt Du sie einfach in Ruhe:

Code: Alles auswählen

try:
    with open("beispiel.txt") as datei:
        traffic = int(datei.read())
except EnvironmentError:
    print("Konnte verbrauchten Traffic nicht lesen. Nehme 0.")
    traffic = 0
Jetzt könnte es noch sein, dass in der Datei gar keine Zahl steht, sie also richtig gelesen wird aber "Blabla" drin steht. Dann meckert »int« mit einem ValueError. Den kannst Du jetzt zusätzlich abfangen:

Code: Alles auswählen

try:
    with open("beispiel.txt") as datei:
        traffic = int(datei.read())
except EnvironmentError:
    print("Konnte verbrauchten Traffic nicht lesen. Nehme 0.")
    traffic = 0
except ValueError:
    print("Es steht keine Zahl in der Datei. Nehme 0.")
    traffic = 0
Grüße
Sirius
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Ein nacktes except ist auch niemals gut. Probiere im interaktiven Interpreter doch einfach mal aus, welche Ausnahmen geworfen werden, wenn Du verschiedene Fehler provozierst (zugreifen auf eine nicht existierende Datei, Division durch 0, Zugriff auf einen nicht existierenden Listenndex, ...).

Die für Dein Problem passende Ausnahme fängst Du dann mittels

Code: Alles auswählen

except NameDesAusnahmeTyps:
ab.

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten