有时使用ipython时,您可能会在以写入模式打开文件的函数中遇到异常。这意味着下次运行该函数时会出现值错误
ValueError:文件'filename'已经打开。请在以写入模式重新打开之前关闭它。
然而,由于函数被淘汰,文件句柄(在函数内部创建)丢失,因此无法关闭。绕过它的唯一方法似乎是关闭ipython会话,此时你会收到消息:
关闭剩余的打开文件:filename ... done
有没有办法指示ipython关闭文件而不退出会话?
答案 0 :(得分:10)
在处理文件时,您应该尝试始终使用with
语句。例如,使用类似
with open("x.txt") as fh:
...do something with the file handle fh
这确保了在执行with
块期间出现问题并引发异常时,保证文件被关闭。有关详细信息,请参阅with documentation。
编辑:在评论中进行讨论之后,OP似乎需要同时打开多个文件,并且需要同时使用多个文件中的数据。很明显,有很多嵌套的with
语句,每个文件打开一个,不是一个选项,违背了“扁平比嵌套更好”的理想。
一种选择是将计算包装在try
/ finally
块中。例如
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()
finally块包含应在任何try
,except
或else
块之后运行的代码,即使发生异常也是如此。来自documentation:
如果存在
finally
,则指定“清理”处理程序。执行try
子句,包括任何except
和else
子句。如果任何子句中发生异常但未处理,则会临时保存该异常。执行finally
子句。如果存在已保存的异常,则会在finally
子句的末尾重新引发该异常。如果finally
子句引发另一个异常或执行return或break语句,则保存的异常将丢失。在执行finally
子句期间,程序无法使用异常信息。
答案 1 :(得分:7)
一些想法:
finally
(或with
块),因此它们已正确关闭。os.close(n)
盲目地关闭非标准文件描述符,其中n
是一个大于2的数字(这是unix特定的,所以你可能想看看/proc/ipython_pid/fd/
看看是什么到目前为止,该过程已经打开了描述符。)sys.last_traceback