必定是那些日子之一。我一直能够使用函数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。
答案 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
请告诉我这是否适合您!