Fermer tous les fichiers ouverts sur ipython
parfois, en utilisant ipython, vous pouvez frapper une exception dans une fonction qui a ouvert un fichier en mode écriture. Cela signifie que la prochaine fois que vous exécutez la fonction que vous obtenez une valeur d'erreur,
ValueError: le fichier 'filename' est déjà ouvert. Veuillez le fermer avant de le rouvrir en mode écriture.
cependant depuis que la fonction a été désactivée, la poignée de fichier (qui a été créée à l'intérieur de la fonction) est perdue, donc elle ne peut pas être fermée. La seule façon autour de lui semble être pour fermer la ipython session, au point où vous obtenez le message:
fermeture des fichiers restants: nom du fichier... fait
Est-il un moyen de demander ipython pour fermer les fichiers sans quitter la session?
2 réponses
vous devriez toujours essayer d'utiliser le with
déclaration lorsque vous travaillez avec des fichiers. Par exemple, utilisez quelque chose comme
with open("x.txt") as fh:
...do something with the file handle fh
cela garantit que si quelque chose tourne mal pendant l'exécution du with
bloc, et une exception est levée, le fichier est garanti d'être fermé. Voir le avec documentation pour plus d'informations sur cette.
Modifier: suite à une discussion dans les commentaires, il semble que L'OP ait besoin d'avoir un nombre de fichiers ouverts en même temps et doit utiliser les données de plusieurs fichiers à la fois. Clairement avoir beaucoup de imbriquée with
états, un pour chaque fichier ouvert, n'est pas une option et va à l'encontre de l'idéal que "la télévision est mieux que imbriqués".
Une option serait d'envelopper le calcul dans un try
/finally
bloc. Par exemple,
file_handles = []
try:
for file in file_list:
file_handles.append(open(file))
# Do some calculations with open files
finally:
for fh in file_handles:
fh.close()
le bloc final contient le code qui doit être exécuté après tout try
,except
ou else
bloquent, même si un exception s'est produite. À partir de la documentation:
Si
finally
est présent, il indique un "nettoyage" de gestionnaire.try
la clause est exécutée, y compris toutexcept
etelse
les clauses. Si une exception se produit dans l'une quelconque des clauses et n'est pas traitée, l'exception est temporairement enregistré.finally
la clause est exécutée. S'il y a une exception sauvegardée, elle est soulevée à la fin definally
l'article. Si lefinally
la clause soulève une autre exception ou exécute une instruction return ou break, l'exception sauvegardée est perdue. L'information d'exception n'est pas disponible au programme pendant l'exécution dufinally
l'article.
quelques idées:
- toujours
finally
(ouwith
bloquer) lorsque vous travaillez avec des fichiers, de sorte qu'ils sont correctement fermées. - vous pouvez fermer aveuglément les descripteurs de fichier non standard en utilisant
os.close(n)
oùn
est un nombre supérieur à 2 (c'est spécifique à unix, donc vous pourriez vouloir regarder/proc/ipython_pid/fd/
pour voir quels descripteurs le processus a ouvert jusqu'à présent). - vous pouvez inspecter les cadres de pile capturés locaux pour voir si vous pouvez trouver la référence à la rebelle fichier et fermez-le... jetez un oeil à
sys.last_traceback