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,except或else块,即使出现异常.从文档:
如果
finally存在,则指定"清理"处理程序.该try子句被执行,包括任何except和else条款.如果任何子句中发生异常但未处理,则会临时保存该异常.该finally条款已执行.如果存在已保存的异常,则在该finally子句的末尾重新引发.如果该finally子句引发另一个异常或执行return或break语句,则保存的异常将丢失.在执行该finally子句期间,程序无法获得异常信息.
一些想法:
finally(或with块),因此它们已正确关闭.os.close(n)where n大于2的数字盲目地关闭非标准文件描述符(这是特定于unix的,因此您可能希望查看/proc/ipython_pid/fd/到目前为止该进程已打开的描述符).sys.last_traceback