Schließen von Dateien, die ordnungsgemäß mit urllib2.urlopen () geöffnet wurden

7

Ich habe folgenden Code in einem Python-Skript

%Vor%

Ich mache mir Sorgen, denn wenn ich auf sf.read() einen Fehler erhalte, wird sf.clsoe() nicht aufgerufen. Ich habe versucht, sf.close() in einen finally Block zu setzen, aber wenn es eine Ausnahme auf urlopen() gibt, dann gibt es keine Datei zum Schließen und ich stoße auf eine Ausnahme im finally Block!

Also habe ich es versucht

%Vor%

, aber dies führte zu einem ungültigen Syntaxfehler in der with... -Zeile. Wie kann ich am besten damit umgehen, ich fühle mich dumm!

Wie Kommentatoren darauf hingewiesen haben, verwende ich Pys60, das Python 2.5.4 ist

    
fearoffours 07.10.2010, 10:31
quelle

8 Antworten

6

Warum versuchst du nicht einfach, sf zu schließen und passierst, wenn es nicht existiert?

%Vor%     
unutbu 07.10.2010, 11:32
quelle
16

Ich würde contextlib.closing verwenden (in Kombination mit __future__ import with_statement für alte Python-Versionen):

%Vor%

Oder, wenn Sie die with-Anweisung vermeiden möchten:

%Vor%

Nicht ganz so elegant.

    
Daniel 13.02.2013 08:18
quelle
8
%Vor%     
dgarcia 07.10.2010 12:22
quelle
1

Wenn Sie versuchen, 'mit' zu verwenden, sollten Sie Python 2.5 verwenden, und dann gilt das auch: Ссылка

    
Habbie 07.10.2010 10:44
quelle
0

Sieht so aus, als ob das Problem tiefer läuft als ich dachte - dieser Forum-Thread zeigt an, dass urllib2 nicht funktioniert t implementieren with bis nach Python 2.6 und möglicherweise nicht bis 3.1

    
fearoffours 07.10.2010 11:20
quelle
0

Sie könnten Ihren eigenen generischen URL-Öffner erstellen:

%Vor%

Dann könnten Sie dann Ihre Syntax von Ihrer ursprünglichen Frage verwenden:

%Vor%

Diese Lösung bietet Ihnen eine saubere Trennung von Bedenken. Sie erhalten eine saubere generische URLopener-Syntax, die die Komplexität des ordnungsgemäßen Schließens der Ressource behandelt, unabhängig von Fehlern, die unter Ihrer Klausel with auftreten.

    
cclauss 25.08.2013 15:15
quelle
0

Warum nicht einfach mehrere try / except Blöcke verwenden?

%Vor%     
onlynone 24.03.2015 13:28
quelle
0

Wenn urlopen () eine Ausnahme hat, fangen Sie sie ab und rufen Sie die close () -Funktion der Exception wie folgt auf:

%Vor%

Die Ausnahme ist auch ein vollständiges Antwortobjekt. Sie können diese Problemmeldung sehen: Ссылка

    
Honsen 19.05.2017 02:43
quelle