J'ai écrit mon code pour python 2.7 mais le serveur en a 2.5. Comment puis-je réécrire le code suivant pour qu'il s'exécute en python 2.5.2:

gzipHandler = gzip.open(gzipFile)

try:
    with open(txtFile, 'w') as out:
        for line in gzipHandler:
            out.write(line)
except: 
    pass

En ce moment, lorsque j'essaie d'exécuter mon script, j'obtiens cette erreur:

Avertissement: 'avec' deviendra un mot clé réservé dans Python 2.6 Traceback (dernier appel le plus récent): Fichier "Main.py", ligne 7, depuis Extractor import Extractor File "/data/client/scripts/Extractor.py", ligne 29 avec open (self._logFile, 'w') comme sortie: ^ SyntaxError: syntaxe invalide

Merci, Ron.

6
Ron D. 27 oct. 2011 à 19:56

3 réponses

Meilleure réponse

Dans Python 2.5, vous pouvez utiliser l'instruction with - il suffit de l'importer depuis __future__:

from __future__ import with_statement
19
Sven Marnach 27 oct. 2011 à 15:58

Si vous ne pouvez pas ou ne voulez pas utiliser with, utilisez finally:

gzipHandler = gzip.open(gzipFile)
out = open(txtFile, 'w')
try:
    for line in gzipHandler:
        out.write(line)
finally:
    out.close()
    gzipHandler.close()

Le code de nettoyage de la clause finally sera toujours exécuté, qu'une exception soit déclenchée ou non.

3
ekhumoro 27 oct. 2011 à 18:51

L'ancienne version du code dans votre bloc try / except serait:

out = open(txtFile, 'w')
for line in gzipHandler:
    out.write(line)
out.close()

Le with open() ... gestionnaire de contexte est effectivement la même chose ici. Python ferme automatiquement les fichiers lorsque leurs objets sont récupérés (voir question 575278 pour plus de détails), donc out sera fermé lorsque la fonction dans laquelle il se trouve cesse de s'exécuter pour une raison quelconque. De plus, le système d'exploitation fermera le fichier à la fin du processus Python en cas d'échec catastrophique pour une raison quelconque avant l'exécution de out.close().

Le gestionnaire de contexte with open() s'étendra à environ:

out = open(txtFile, 'w')
try:
    for line in gzipHandler:
        out.write(line)
finally:
    out.close()

Voir le lien ci-dessus vers "gestionnaire de contexte" pour une explication. Alors, comment ça marche? Il ouvre le fichier, exécute votre bloc de code, puis ferme explicitement le fichier. Comment fonctionne «l'ancienne» version que je décris? Il ouvre le fichier, exécute votre bloc de code, puis ferme implicitement le fichier lorsque sa portée est terminée ou lorsque le processus Python se termine.

Sauf pour les parties "explicites" vs "implicites", la fonctionnalité est identique.

-1
Community 23 mai 2017 à 12:08
7918745