任何人都可以阐明该示例为何起作用:
import numpy as np
def write_data(fn, var):
with open(fn, 'wb') as fout:
header = 'TEST\n'
np.savetxt(fout, var, fmt='%.2f', header=header, delimiter=' ', comments='')
data = np.asarray([[1.0, 2.0], [3.0, 4.0]])
out_file = 'out/test.txt'
write_data(out_file, data)
但是如果将write_data
更改为:
def write_data(fn, var):
fout = open(fn, 'wb')
header = 'TEST\n'
np.savetxt(fout, var, fmt='%.2f', header=header, delimiter=' ', comments='')
我不想编写如下所示的代码,但是有人来找我,问为什么这个代码不起作用,而我根本没有答案。在大写情况下,将使用预期的标头和数据写入文件,但在小写情况下,将创建文件,但该文件为空。没有错误报告,没有引发异常。
奇怪的是,在原始情况下(更长),打印var
也将导致非with
示例开始工作,这使我认为这可能是时间问题,因为在所示示例中打印var
对我的机器没有影响。
已经指出,这两个示例也解决了该问题:
def write_data(fn, var):
fout = open(fn, 'wb')
header = 'TEST\n'
np.savetxt(fout, var, fmt='%.2f', header=header, delimiter=' ', comments='')
fout.close()
def write_data(fn, var):
fout = open(fn, 'wb', buffering=0)
header = 'TEST\n'
np.savetxt(fout, var, fmt='%.2f', header=header, delimiter=' ', comments='')
但这可以将问题缩小到:为什么Python不会刷新已取消引用的文件句柄,以及导致文件缓冲区被刷新的原因是什么,因为显然执行其他操作会导致此情况自动发生?
例如,下面的示例使问题得到“解决”,或者在带给我的原始问题中被规避了(添加了许多与该问题无关的代码)。
def write_data(fn, var):
fout = open(fn, 'wb')
header = 'TEST\n'
print(var)
np.savetxt(fout, var, fmt='%.2f', header=header, delimiter=' ', comments='')
答案 0 :(得分:1)
我想您应该关闭打开的文件:
def write_data(fn, var):
fout = open(fn, 'wb')
header = 'TEST\n'
np.savetxt(fout, var, fmt='%.2f', header=header, delimiter=' ', comments='')
fout.close()