2017-08-30 3 views
1

Quelle est la manière de Pythonic d'essayer de lire un fichier et si cette lecture lève une exception fallback pour lire un autre fichier?Manière pythonique d'essayer de lire un fichier et en cas d'exception repli sur le fichier de remplacement

Voici l'exemple de code que j'ai écrit, qui utilise des blocs try - except imbriqués. Est-ce pythonique:

try: 
    with open(file1, "r") as f: 
     params = json.load(f) 
except IOError: 
    try: 
     with open(file2, "r") as f: 
      params = json.load(f) 
    except Exception as exc: 
     print("Error reading config file {}: {}".format(file2, str(exc))) 
     params = {} 
except Exception as exc: 
    print("Error reading config file {}: {}".format(file1, str(exc))) 
    params = {} 

Répondre

1

Pour deux fichiers l'approche est à mon avis assez bon .

Si vous aviez plusieurs fichiers à REPLI j'aller avec une boucle:

for filename in (file1, file2): 
    try: 
     with open(filename, "r") as fin: 
      params = json.load(f) 
     break 
    except IOError: 
     pass 
    except Exception as exc: 
     print("Error reading config file {}: {}".format(filename, str(exc))) 
     params = {} 
     break 
else: # else is executed if the loop wasn't terminated by break 
    print("Couldn't open any file") 
    params = {} 
0

Vous pouvez vérifier si fichier1 existe d'abord, puis décider quel fichier à ouvrir. Cela raccourcira le code et évitera de répéter la clause try -- catch. Je crois que c'est plus pythonique, cependant notez que vous devez import os dans votre module pour que cela fonctionne. Il peut être quelque chose comme:

fp = file1 if os.path.isfile(file1) else file2 
if os.path.isfile(fp): 
    try: 
     with open(fp, "r") as f: 
      params = json.load(f) 
    except Exception as exc: 
     print("Error reading config file {}: {}".format(fp, str(exc))) 
      params = {} 
else: 
    print 'no config file' 
+2

Cela peut entraîner des conditions de course, plus 'OSError' pourrait aussi être dû à' PermissionError' etc. –

+0

Pas vous obtenir 'PermissionError' de toute façon si vous essayez de' open (fp, "r") 'sans les autorisations appropriées? – Vinny

0

Bien que je ne suis pas exactement certain que ce soit pythonique ou non, peut-être quelque chose comme:

file_to_open = file1 if os.path.isfile(file1) else file2