为什么`np.savetxt`可以在`with`内部使用文件,而不能在外部使用?

时间:2019-01-22 01:21:58

标签: python numpy

任何人都可以阐明该示例为何起作用:

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='')

1 个答案:

答案 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()