如果我们每次处理前后都需要从大文件中读取/写入一些数据,以下哪种方式(带有一些演示Python代码(更好?
-
每次需要读/写时打开文件,读/写后立即关闭。这样似乎更安全?但是慢了,因为我们需要打开和关闭很多次?
for i in processing_loop: with open(datafile) as f: read_data(...) process_data(...) with open(resultfile,'a') as f: save_data(...)
这看起来很尴尬,但似乎 matlab 在其.mat
文件 IO 函数中采用这种方式load
和save
.我们直接调用load
和save
,没有明确的open
也没有close
。
打开文件 并关闭,直到我们完成所有工作,速度更快,但如果程序引发错误,则文件保持打开状态,或者如果程序意外终止,文件损坏。
fr = open(datafile) fw = open(resultfile,'a') for i in processing_loop: read_data(...) process_data(...) save_data(...) fr.close() fw.close()
事实上,当程序被杀死时,我有几个hdf5
文件以这种方式损坏。
似乎伙计们更喜欢第二个将循环包裹在with
.
with open(...) as f:
...
或在异常捕获块中。
我知道这两件事,我确实用过它们。但是当程序被杀死时,我的hdf5
文件仍然损坏。
有一次我试图将一个巨大的数组写入 hdf5 文件,程序卡住了很长时间,所以我杀死了它,然后文件就损坏了。
很多时候,程序会因为服务器突然关闭或运行时间超过挂机时间而终止。
我没有注意是否仅在将数据写入文件时程序终止时才发生损坏。如果是这样,则表示文件结构已损坏,因为它不完整。因此,我徘徊是否每次刷新数据会有所帮助,这会增加 IO 负载,但可能会减少终止时将数据写入文件的机会。
我尝试了第一种方法,仅在需要读取/写入数据时才访问文件。但显然速度变慢了。当我们打开/关闭文件句柄时,后台会发生什么?不仅仅是制作/销毁指针?为什么open/close
运营成本如此之高?
如果您担心在 "with" 语句中使用多个文件,则可以使用复合语句打开多个文件,或嵌套 "with" 块。这在回答中有详细说明:
如何使用 open with 语句打开文件
至于当程序引发错误时会发生什么,这就是try/except 块的用途。如果您知道预期会出现哪些错误,则可以轻松地将 process_data(( 调用包围起来。同样,一个 except 块可以捕获多个异常。
https://docs.python.org/3/tutorial/errors.html#handling-exceptions
解决方案2中的代码包装在try except finally
中,并始终最终关闭该文件。这样,即使会出现错误,您的文件也会自行关闭。
编辑:正如其他人指出的那样,您可以使用with
为您处理这个问题。