如果我们需要在处理之前/之后每次从/向大文件读取/写入一些数据,以下哪种方式(使用一些演示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负载,但可能会降低终止时将数据写入文件的可能性。[/ p>
我尝试了第一种方法,只有在需要读/写数据时访问文件。但显然速度很慢。打开/关闭文件句柄时后台会发生什么?不只是制作/销毁指针?为什么open/close
操作费用如此之高?
答案 0 :(得分:0)
您应该将代码包装在try except finally
的解决方案2中,并始终最终关闭该文件。这样即使出现错误,您的文件也会自行关闭。
编辑:正如其他人指出的那样,您可以使用with
为您处理。
答案 1 :(得分:0)
如果您担心在“with”语句中使用多个文件,则可以使用复合语句打开多个文件,或嵌套“with”块。这在答案中有详细说明:
How to open a file using the open with statement
至于程序引发错误时会发生什么,这就是try / except块的用途。如果您知道预期的错误,您可以轻松地围绕您的process_data()调用。同样,除了块之外的一个可以捕获多个异常。
https://docs.python.org/3/tutorial/errors.html#handling-exceptions