关闭ipython中的所有打开文件

tdc*_*tdc 12 python filehandle ipython

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

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

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

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

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

Chr*_*ris 11

with在处理文件时,您应该尝试始终使用该语句.例如,使用类似的东西

with open("x.txt") as fh:
    ...do something with the file handle fh
Run Code Online (Sandbox Code Playgroud)

这样可以确保在执行with块期间出现问题并引发异常时,可以保证文件已关闭.有关详细信息,请参阅with文档.

编辑:在评论中讨论后,似乎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()
Run Code Online (Sandbox Code Playgroud)

finally块包含任何应后运行代码try,exceptelse块,即使出现异常.从文档:

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


for*_*ran 7

一些想法:

  • 使用文件时始终使用finally(或with块),因此它们已正确关闭.
  • 您可以使用os.close(n)where n大于2的数字盲目地关闭非标准文件描述符(这是特定于unix的,因此您可能希望查看/proc/ipython_pid/fd/到目前为止该进程已打开的描述符).
  • 你可以检查捕获的堆栈帧本地,看看你是否可以找到任意文件的引用并关闭它...看一看 sys.last_traceback