关闭ipython中的所有打开文件

时间:2012-01-24 16:27:39

标签: python ipython filehandle

有时使用ipython时,您可能会在以写入模式打开文件的函数中遇到异常。这意味着下次运行该函数时会出现值错误

  

ValueError:文件'filename'已经打开。请在以写入模式重新打开之前关闭它。

然而,由于函数被淘汰,文件句柄(在函数内部创建)丢失,因此无法关闭。绕过它的唯一方法似乎是关闭ipython会话,此时你会收到消息:

  

关闭剩余的打开文件:filename ... done

有没有办法指示ipython关闭文件而不退出会话?

2 个答案:

答案 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块包含应在任何tryexceptelse块之后运行的代码,即使发生异常也是如此。来自documentation

  

如果存在finally,则指定“清理”处理程序。执行try子句,包括任何exceptelse子句。如果任何子句中发生异常但未处理,则会临时保存该异常。执行finally子句。如果存在已保存的异常,则会在finally子句的末尾重新引发该异常。如果finally子句引发另一个异常或执行return或break语句,则保存的异常将丢失。在执行finally子句期间,程序无法使用异常信息。

答案 1 :(得分:7)

一些想法:

  • 在处理文件时始终使用finally(或with块),因此它们已正确关闭。
  • 你可以使用os.close(n)盲目地关闭非标准文件描述符,其中n是一个大于2的数字(这是unix特定的,所以你可能想看看/proc/ipython_pid/fd/看看是什么到目前为止,该过程已经打开了描述符。)
  • 您可以检查捕获的堆栈帧本地,以查看是否可以找到对任性文件的引用并将其关闭...查看sys.last_traceback