Neuling braucht Hilfe

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.
ND
User
Beiträge: 4
Registriert: Freitag 10. Juni 2005, 10:31

Hi,

hab gerade erst angefangen mich mit Python zu beschäftigen und bin beim stöbern durch Dokumentationen auf dieses Forum hier gestoßen und hab schon fleißig gelesen.
Hoffe ihr könnt mir helfen.
Also ich hab eine Funktion definiert und in dieser Funktion werden Informationen von Bildern ausgelesen. Das klappt auch soweit alles, nur wenn jetzt statt nem Bild ne TXT geöffnet wird, dann kommt immer ne Fehlermeldung.
Wie mach ich das nun das wenn kein image geöffnet wird, einfach nix passiert, also die Funktion gar nicht ausgeführt wird?


Danke für eure Hilfe.
ND
Corny
User
Beiträge: 15
Registriert: Dienstag 11. Januar 2005, 10:48
Wohnort: München

Bin zwar auch nur ein Neuling - also meine Tipps mit Vorsicht genießen :D - aber ich würde da den try benutzen...

also:

Code: Alles auswählen

try:
    <code einfügen: ist Datei ein Bild?, vielleicht auf Dateiendung prüfen>
    a=0
except:
    print "Kein Bild!"
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Bei Fehlern kommt immer eine Exception. Was ist denn diese, wenn du eine TXT Datei öffnest?

Sonst ist Cornys Weg schon sehr gut:

Code: Alles auswählen

try:
    # code einfügen: ist Datei ein Bild?, vielleicht auf Dateiendung prüfen
    a=0
except DeineExceptionDieDuBekommst:
    print "Kein Bild!"
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

hallo,


ich würde die dateien durch eine schleife schicken und jede auf ihre endung überprüfen:

Code: Alles auswählen


>>> file_list=['bild1.jpg','text.txt','bild2.jpg']
>>> for item in file_list:
	if item.endswith('.jpg'):
		print 'ok' # bzw. tu irgendwas, z.b. die funktion ausführen
	else:
		print 'nicht ok' # bzw. tu irgendwas anderes, oder nichts 

		
ok
nicht ok
ok
>>> 
wenn mit try, except, dann den genauen fehlertyp bei except angeben,...

grüße

rolgal
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

In diesem Fall hat EAFP wirklich Vorteile: Wenn du ein ".jpeg" hast, wird es bei rolgals Prüfung durchfallen. Oder auch, wenn man ein JPEG mit falscher Endung hat, dass würde auch abgelehnt werden. Außerdem müsste man jede Dateiendung explizit freigeben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ND
User
Beiträge: 4
Registriert: Freitag 10. Juni 2005, 10:31

Ich würde am liebsten eine if valid Schleife machen, weiß einer wie das geht?
Danke für eure Tipps.
Und dann hätte cih da noch eine andere Frage: DIe Variablen die ich angebe, sind das lokale oder globale Variablen?


THX ND
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

ND hat geschrieben:...
Und dann hätte cih da noch eine andere Frage: DIe Variablen die ich angebe, sind das lokale oder globale Variablen?
...
Bin selbst zwar Neuling, aber soweit ich es aus Büchern verstanden habe, sind alle Variablen, die in Funtkionen oder/und Classen verwendet werden, automatisch lokal, während die anderen, die also nicht in Funktionen und dergleichen erstellt/zugewiesen werden, sondern eben im Script allgemein, global.

Wenn eine Funktion dann eine Variable benutzen soll, die lokal nicht vorhanden ist, greift es auf die Globale zurück, falls vorhanden ist.
Aber auf lokaler ebenen kann es die globalen Variablen nur einlesen. Nicht bearbeiten.
Wenn es auch die globalen Variablen verändern soll, also bearbeiten, muß mann im lokalen bereich erst mit dem Befehl 'global' 'XY' den Zugriff erst ermöglichen.

(Hoffe mal, daß ich hier nichts falsches geschrieben habe)
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Gast

Danke, das hilft mir schon mal ein bissl weiter, denn so umgeh cih Konflike. Könnt ihr irgend ein gutes Buch empfehlen um Python Programmierung zu lernen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erwin hat geschrieben:Wenn es auch die globalen Variablen verändern soll, also bearbeiten, muß mann im lokalen bereich erst mit dem Befehl 'global' 'XY' den Zugriff erst ermöglichen.
Dies ist aber schlechter Stil und sollte in Python vermieden werden, so kann man es Beispielsweise durch Hapselung in Klassen umgehen.

ND: Es hängt halt ab, was du suchst: wenn du ein Einführtungsbuch suchst, dann sollte es nicht Python Ge-packt sein, denn das ist eine Referenz (so wie Python kurz und gut, die dritte Ausgabe ist grad rausgekommen, die hätte ich recht gerne). Aber guck doch mal in BuchBesprechungen, da sind einige, und im Forum findest du auch einige. Ich habe zwar Einführung in Python, jedoch habe ich es kaum benutzt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Leonidas hat geschrieben:
Erwin hat geschrieben:Wenn es auch die globalen Variablen verändern soll, also bearbeiten, muß mann im lokalen bereich erst mit dem Befehl 'global' 'XY' den Zugriff erst ermöglichen.
Dies ist aber schlechter Stil und sollte in Python vermieden werden, so kann man es Beispielsweise durch Hapselung in Klassen umgehen.
...
Ist aber der einzige Stil den ich kenne.
Erkläre mir mal den anderen.
Vor allem würde mich auch die Unterschiede interessieren.
Will ja nicht, daß mein Zeug irgendwann in Konflikt gerät, weil ich schwamige Codezeilen hergenommen habe.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erwin hat geschrieben:Ist aber der einzige Stil den ich kenne.
Erkläre mir mal den anderen.
Vor allem würde mich auch die Unterschiede interessieren.
Will ja nicht, daß mein Zeug irgendwann in Konflikt gerät, weil ich schwamige Codezeilen hergenommen habe.
Das sieht so in etwa aus:

Code: Alles auswählen

variable = False
def schlecht():
    global variable
    variable = True

class Gut(object):
    def __init__(self):
        self.variable = False
    def gut(self):
        self.variable = True

g = Gut()
g.gut()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Anonymous hat geschrieben:Danke, das hilft mir schon mal ein bissl weiter, denn so umgeh cih Konflike. Könnt ihr irgend ein gutes Buch empfehlen um Python Programmierung zu lernen?
Nicht direkt.
Hätte da einen Link zu EDV Buchversand:
http://www.edv-buchversand.de/search.ph ... image.y=13
Aber empfehlen ... das ist so eine Sache.
Jeder empfindet ein Buch auch anders, oder versteht Beispiele ect. unterschiedlich gut.
Achja, beim Buchhändler kann man auch direkt dannach fragen. Normalerweis läßt sich ja alles bestellen, vorrausgesetzt daß es noch zu haben ist. Bei mir sind die Buchändler(innen) immer sehr Hilfsbereit und sagen mir im groeben, was im Buch drinn steht.

@ Leanidas:
Das muß ich erst mal verdauen.
Mag zwar gut sein, aber auch recht ... komplex. Mehr Code.
Hmm... Object?
Also zuerst wird wohl mit g die bewußte Variable geschaffen, die wiederum mit der Zuteilung/Classe 'Gut' als global festgelegt wird? In die Klammern kommt nichts.
Die Variable muß aber dann immer mit '.gut()' angesprochen werden ...?
Und was ist mit dem False, True? bei einem Durchlauf ... wird es dann nicht zuerst False und gleich wieder True?
Was ist eigentlich am einfachen Code so gefährlich? Was kann da passieren?
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

schau mal hier unter http://www.cl.uni-heidelberg.de/kurs/ws ... index.html nach, das ist ein toller Python Online Kurs...

Tabellar
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erwin hat geschrieben:@ Leanidas:
Das will ich mal überhört haben ;)
Erwin hat geschrieben:Das muß ich erst mal verdauen.
Mag zwar gut sein, aber auch recht ... komplex. Mehr Code.
Hmm... Object?
Du kannst auch '(object)' auslassen, das macht auch einer normalen Klasse eine New-Style-Klasse. Ist hier nicht direkt notwendig, aber wie lautet es so schön: All the cool kids are using 2.4 these days. (New-Style Klassen sind zwar nicht ein 2.4er Feature, aber trotzdem eine ziemlich nette Sache).
Erwin hat geschrieben:Also zuerst wird wohl mit g die bewußte Variable geschaffen, die wiederum mit der Zuteilung/Classe 'Gut' als global festgelegt wird? In die Klammern kommt nichts.
Nein, g ist eine Instanz der Klasse Gut. Zum erstellen der Klasse brauche ich in diesem Fall nichts an den Konstruktor __init__ zu übergeben, deswegen bleiben die Klammern leer.
Erwin hat geschrieben:Die Variable muß aber dann immer mit '.gut()' angesprochen werden ...?
Nein, die Variable wird dann mit g.variable angesprochen. So kann sich auch modifiziert werden.
Erwin hat geschrieben:Und was ist mit dem False, True? bei einem Durchlauf ... wird es dann nicht zuerst False und gleich wieder True?
Verstehe die Frage nicht :?:
Erwin hat geschrieben:Was ist eigentlich am einfachen Code so gefährlich? Was kann da passieren?
Das er extrem unseserlich wird. Sieh mal: du hast eine Funktion. Diese rufst du auf. Diese macht irgendwas, gibt einen Wert zurück und beendet sich. Das ist nachvollziehbar. Was aber nicht nachvollziehbar ist, ist dass diese Funktion so ganz nebenbei noch alle möglichen Variablen ändert, erstellt und so weiter, die sie eigentlich gar nicht angehen sollten.

Wenn du lust hast, kannst du dir mal den Artikel zum Thema Wirkung ansehen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Leonidas hat geschrieben:
Erwin hat geschrieben:@ Leanidas:
Das will ich mal überhört haben ;)
:oops:
Naja, macht eigentlich nichts. Du hast mich öfters Edwin gennant.
Da habe ich eh noch was gut. ;)
Leonidas hat geschrieben:
Erwin hat geschrieben:Und was ist mit dem False, True? bei einem Durchlauf ... wird es dann nicht zuerst False und gleich wieder True?
Verstehe die Frage nicht :?:

Code: Alles auswählen

class Gut(object): 
    def __init__(self): 
        self.variable = False 
    def gut(self): 
        self.variable = True 
Achso? Das init wird auf False gesetzt?
Aber zugleich auch die Variable.
Welche dann bei def gut wieder auf True gesetzt wird?
Nein, da blicke ich (noch?) nicht durch.
Bei Classaufruf ... hm.. ist das eine dann zum löschen gedacht?
Leonidas hat geschrieben:
Erwin hat geschrieben:Was ist eigentlich am einfachen Code so gefährlich? Was kann da passieren?
Das er extrem unseserlich wird. Sieh mal: du hast eine Funktion. Diese rufst du auf. Diese macht irgendwas, gibt einen Wert zurück und beendet sich. Das ist nachvollziehbar. Was aber nicht nachvollziehbar ist, ist dass diese Funktion so ganz nebenbei noch alle möglichen Variablen ändert, erstellt und so weiter, die sie eigentlich gar nicht angehen sollten.
Hm.. aber innerhalb einer Funktion kann es eh aber nur die Lokalen Variablen verändern. Die Globalen nur, wenn ich diese innerhalb der Funktion global mache.
Wenn man gut strukturiert (Namentlich) vor geht, dürfte da nicht viel passieren, denk ich.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erwin hat geschrieben::oops:
Naja, macht eigentlich nichts. Du hast mich öfters Edwin gennant.
Da habe ich eh noch was gut. ;)
Wo denn? *g* Ach, die Edit-Funktion ist schon praktisch :D
Erwin hat geschrieben:

Code: Alles auswählen

class Gut(object): 
    def __init__(self): 
        self.variable = False 
    def gut(self): 
        self.variable = True 
Achso? Das init wird auf False gesetzt?
Aber zugleich auch die Variable.
Welche dann bei def gut wieder auf True gesetzt wird?
Nein, da blicke ich (noch?) nicht durch.
__init__ wird beim Initialisieren der Klasse ausgeführt (siehe Gut()). Dort wird die Klasseninterne Variable variable auf False gesetzt. Die ist nun solange False, bis du gut() aufrufst.
Erwin hat geschrieben:Bei Classaufruf ... hm.. ist das eine dann zum löschen gedacht?
Nein, ich lösche hier nichts. Das überlasse ich dem Garbage Collector.
Erwin hat geschrieben:Hm.. aber innerhalb einer Funktion kann es eh aber nur die Lokalen Variablen verändern. Die Globalen nur, wenn ich diese innerhalb der Funktion global mache.
Wenn man gut strukturiert (Namentlich) vor geht, dürfte da nicht viel passieren, denk ich.
Die Globalen sind eben mit gutem Grund nur lesbar gemacht. Diesen habe ich dir erklärt aber wenn du unbedingt Funktionen mit Nebenwirkungen haben willst, ist das deine Entscheidung.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

@ Leonidas

Da ich offen gestanden Probleme habe, das Sichere Konzept zu verstehen, was ich vom Leichtem nicht behaupten kann, macht es für mich bestimmt nicht viel Sinn das Sichere zu verwenden.
Und da reinarbeiten ... das ist mir zur Zeit ... zu verwirrend. Das dauert.

So lange beim Einfachem nur dann Fehler auftreten können, weil ich versehentlich auf Global zugreifen lass (also mit Namen vertan habe), sehe ich da kein wirkliches Problem.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erwin hat geschrieben:Da ich offen gestanden Probleme habe, das Sichere Konzept zu verstehen, was ich vom Leichtem nicht behaupten kann, macht es für mich bestimmt nicht viel Sinn das Sichere zu verwenden.
Und da reinarbeiten ... das ist mir zur Zeit ... zu verwirrend. Das dauert.
Klassen musst du so oder so früher oder später lernen, also von dem her..
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Man macht also eine Klasse, die wiederum Variablen abfertigt?
Hört sich für mich umständlich an.
Da warte ich lieber, bis mal wirklich was los ist.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erwin hat geschrieben:Man macht also eine Klasse, die wiederum Variablen abfertigt?
Hört sich für mich umständlich an.
Am besten man schreibt gleich so, dass man globale Variablen vermeidet und fertig.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten