2013-04-08 7 views
8

Ich muss öffnen & schreiben Sie auf etwa 10 verschiedene Dateien alle innerhalb der gleichen Schleife. z:Ausnahmebedingungsdetails in Python erhalten

for i in range(0,10): 
    try: 
     a=5 
     file1 = open("file1.txt",'w+') 
     file2 = open("file2.txt",'w+') 
     #... etc 

     print(str(a),file=file1) 
     print(str(a)+"hi",file=file2) 
     # ... etc 
    except: 
     #error handling 

Nun, was ich möchte in der Lage zu tun spezifische Ausnahme Informationen zu erhalten, wie zum Beispiel, welche Datei innerhalb der allgemeinen Ausnahme geöffnet/geschrieben wurde. Von meinem derzeitigen Verständnis, würde ich so etwas zu tun haben, zu erreichen, was ich will:

for i in range(0,5): 
    a=5 
    try: 
     file1 = open("file1.txt",'w+') 
     print(str(a),file=file1) 
    except: 
     #error handling for file1 
    try: 
     file2 = open("file2.txt",'w+') 
     print(str(a)+"hi",file=file2) 
    except: 
     #error handling for file2 

... Welche extrem klobig erhalten wird und unattraktiv, wenn ich dafür etwa 10 verschiedene Dateien zu tun haben, . Gibt es eine Möglichkeit, die Dateinameninformation aus einer allgemeinen Ausnahme wie in meinem ersten Beispiel zu erhalten? Grundsätzlich könnte die Ausnahme Dinge wie "Fehler beim Schreiben in Datei1" ohne einen Versuch/außer speziell für Datei1-Operationen berichten.

edit: Dies ist eine massive Vereinfachung der Daten, die in die Datei geschrieben werden. str (a) und str (a) + "hi" sind keine wirklich guten Darstellungen der tatsächlich geschriebenen Daten; file1 benötigt möglicherweise eine fest codierte Ganzzahl, wobei Datei2 möglicherweise eine Zeichenfolge benötigt, die mit mehreren Variablen formatiert ist. den Öffnungs-/Schreibprozess in eine Schleife zu verallgemeinern wird nicht sehr gut funktionieren.

Antwort

1

Sie erwähnen die Verwendung einer Schleife, aber Sie verwenden keine Schleife. Benutze eine Schleife. Auf diese Weise können Sie jede Datei einzeln in einen einzelnen try Block schreiben. Sie scheinen nichts mit den Dateien zu tun, außer dass Sie jeweils einen Wert schreiben, sodass Sie sie nicht alle offen halten müssen.

for filename in ['file1.txt', 'file2.txt', ...]: 
    try: 
     with open(filename, 'w+') as f: 
      f.write(str(a)+"whatever") 
    except IOError: 
     print("Error occurred with", filename) 

Edit: Wenn Sie völlig unterschiedliche Dinge zu den verschiedenen Dateien, erstellen Sie einen Wörterbuch oder eine andere Datenstruktur vor der Zeit speichert die Zuordnung zwischen Dateien und Daten, verwenden Sie dann, dass in der Schleife zu schreiben.

data = {'file1.txt': str(a), 'file2.txt': 'something else', 'file3.txt': str(a)+str(b)} 

for filename, output in data.items(): 
    try: 
     with open(filename, 'w+') as f: 
      f.write(output) 
    except IOError: 
     print("Error occurred with", filename) 
+0

ich für den enthaltenen Code gemeint berücksichtigt werden als ob es schon in einer Schleife wäre. ich mache das kaputt. Aber unabhängig davon löst das mein Problem nicht wirklich. Die Dinge, die in diese Dateien geschrieben werden, sind nicht unbedingt in irgendeiner Weise, Form oder Form ähnlich. file1 benötigt möglicherweise eine fest codierte "1", file2 benötigt möglicherweise eine Variable, die gedruckt werden muss, und file3 benötigt möglicherweise mehrere Variablen. was am Ende passieren würde, ist eine riesige if-Aussage innerhalb des "mit"; z.B. "Wenn Dateiname = Datei1, schreib das; wenn Dateiname = Datei2, schreibe das; wenn Dateiname = Datei3, schreibe diese andere Sache". Code wird genauso klobig sein – user891876

+0

@ user891876: Siehe meine bearbeitete Antwort. Bestimmen Sie die Beziehung zwischen Dateien und Daten, und schreiben Sie dann jedes Datenelement in die zugehörige Datei in der Schleife. – BrenBarn

+0

Was ist, wenn ich nicht in Datei 3 drucken möchte, wenn Länge (str (a) + str (b))> 5? Jede Datei benötigt definitiv eine eigene Logik. – user891876

15

können Sie sys.exc_info verwenden, um Informationen über die Ausnahme erhalten zur Zeit selbst, einschließlich des Ausnahme-Objekt behandelt werden. Eine IOError Ausnahme enthält alle Informationen, die Sie benötigen, einschließlich dem Dateinamen, die errno, und eine Zeichenfolge beschreibt den Fehler:

import sys 

try: 
    f1 = open('example1') 
    f2 = open('example2') 
except IOError: 
    type, value, traceback = sys.exc_info() 
    print('Error opening %s: %s' % (value.filename, value.strerror)) 

Ausführung in dem try Block wird offenbar noch stoppt nach der ersten Ausnahme.

1

Wenn exc_type, value, exc_traceback = sys.exc_info() verwenden, beachten Sie, dass der Dateiname, der die Ausnahme erzeugt wird, kann durch die folgende erhalten:

exc_traceback.tb_frame.f_locals.get('filename')