" OSError:无法以二进制模式将对象数组写入文件"

时间:2016-06-28 15:52:37

标签: numpy scipy python-3.5

必定是那些日子之一。我一直能够使用函数tofile来保存数据。但由于某种原因,今天它没有工作:)。

import numpy as np

blah.....

print(type(blist))
npdata = np.array(blist)
print(type(npdata))
npdata.tofile('myfile.dat')

获取以下结果:

Traceback (most recent call last):
File "C:/context.py", line 67, in <module>
npdata.tofile('myfile.dat')
OSError: cannot write object arrays to a file in binary mode
<class 'list'>
<class 'numpy.ndarray'>

所以它说我以二进制模式打开文件。但据我所知,我不是以二进制模式打开它。

编辑(问题解决后):当我发布这个问题时,我假设blist是一个整数列表。相反,它是一个整数列表的列表。问题是,当我创建它时,我得到的是dtype = object而不是我期待的dtype = int32。

士气:确保正确使用np.append / np.extend并始终明确设置dtype。

2 个答案:

答案 0 :(得分:5)

根据tofile文档,如果sep是默认值,它会以二进制模式写入数组。

In [714]: x
Out[714]: array([[1, 2, 3], [1, 2]], dtype=object)

In [715]: x.tofile('test')
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-715-0ff8f3c688ad> in <module>()
----> 1 x.tofile('test')

OSError: cannot write object arrays to a file in binary mode

它以二进制模式打开文件,但后来发现该数组是一个对象数组,它无法以这种方式编写。默认二进制模式用于快速将数字写入文件,而不是常规对象。

指定sep,使其以文本模式写入,在本例中有效:

In [716]: x.tofile('test',sep=',')

In [717]: cat test
[1, 2, 3],[1, 2]

我有另一个包含生成器的对象数组(来自另一个问题)。

In [719]: g.tofile('test',sep=',')

In [720]: cat test
<generator object <genexpr> at 0xb266632c>

因此,在text模式下,tofile将数组的str(x)表示写入文件。

np.save更擅长处理对象数组。它使用pickle来编码它不能作为常规数组写入的对象。 np.load可以重新加载这样的文件。

答案 1 :(得分:1)

以二进制模式打开文件进行写入:

with open(filename, 'wb'):
    do stuff

请告诉我这是否适合您!