try für mehre öffnende Dateien

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
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
Wie kann am einfachsten eine exception für mehre zu öffnende Datei bauen, so dass wenn eine von diesen nicht existiert eine exception ausgelöst wird und der Dateiname angezeigt wird welcher nicht existiert.

Code: Alles auswählen

    
try:
   f = open(f1, 'r')
   f = open(f2, 'r')
   f = open(f3, 'r')
except IOError:
   print 'cannot open', Dateiname
Viele Grüße
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

mit hat geschrieben:Wie kann am einfachsten eine exception für mehre zu öffnende Datei bauen, so dass wenn eine von diesen nicht existiert eine exception ausgelöst wird und der Dateiname angezeigt wird welcher nicht existiert.
Du kannst über eine Liste mit den Dateinamen iterieren.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo mit!

Code: Alles auswählen

try:
    open("uuu", "r")
except IOError, err:
    print err
    print err.args
    print err.errno
    print err.filename
    print err.strerror
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Warum benoetigst du denn 3 offene Dateien gleichzeitig? Daneben ist die Datei nicht öffnen zu können nicht die einzige Quelle für `IOError`s (in dem Fall schon, aber du willst ja wohl auch etwas mit den Dateien machen).

Da deine Dateien nicht geschlossen werden noch der Verweis auch `contextlib.nested` und `with`.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Einfach Python 3.x (oder 2.7) benutzen:

Code: Alles auswählen

with open(...) as f1, open(...) as f2:
    ...
Andernfalls die Anweisungen (sei es nun `with` oder `try/finally`) passend schachteln. Ich sehe nicht, wo da ein prinzipielles Problem ist.

Stefan
lunar

In Python 2.5 und 2.6 kann man stattdessen "contextlib.nested()" verwenden.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

cofi hat geschrieben:Warum benoetigst du denn 3 offene Dateien gleichzeitig?
So wie ich es verstanden habe, müssen nicht unbedingt mehrere Dateien gleichzeitig geöffnet werden (auch wenn der Code das so zeigt), sondern es ging darum, vor der Verwendung der Dateien zu prüfen, ob alle im weiteren Verlauf benötigten Dateien überhaupt vorhanden sind.

Dazu würde es ja genügen, einmal über die Liste aller Dateinamen zu iterieren und festzustellen, ob diese Dateien zum Lesen geöffnet werden können. (Und dann auch brav wieder schließen).
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

numerix hat geschrieben:So wie ich es verstanden habe, müssen nicht unbedingt mehrere Dateien gleichzeitig geöffnet werden (auch wenn der Code das so zeigt), sondern es ging darum, vor der Verwendung der Dateien zu prüfen, ob alle im weiteren Verlauf benötigten Dateien überhaupt vorhanden sind.
Das war eigentlich eher rhetorisch gemeint. Ich wollte den OP mit der Nase darauf stossen, dass das recht selten nötig ist. :twisted:

Um mal einen anderen Ansatz einzuwerfen: Es gibt `os.path.exists` zusammen mit `filter` liesse sich die Anzahl der Dateien auf die gültigen eingrenzen (oder eben auf das Gegenteil).
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

cofi hat geschrieben:Um mal einen anderen Ansatz einzuwerfen: Es gibt `os.path.exists` zusammen mit `filter` liesse sich die Anzahl der Dateien auf die gültigen eingrenzen (oder eben auf das Gegenteil).
Wobei er dann aber noch nicht sicher sein kann, ob die benötigten Zugriffsrechte vorhanden sind ...
Antworten