4

我被以下numpy行为咬伤:

In [234]: savetxt(open('/tmp/a.dat', 'wt'), array([1, 2, 3]))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-234-2adef92da877> in <module>()
----> 1 savetxt(open('/tmp/a.dat', 'wt'), array([1, 2, 3]))

/local/gerrit/python3.2/lib/python3.2/site-packages/numpy/lib/npyio.py in savetxt(fname, X, fmt, delimiter, newline)
   1007         else:
   1008             for row in X:
-> 1009                 fh.write(asbytes(format % tuple(row) + newline))
   1010     finally:
   1011         if own_fh:

TypeError: must be str, not bytes

In [235]: savetxt(open('/tmp/a.dat', 'wb'), array([1, 2, 3]))
# success

我觉得这很奇怪。我正在尝试将我的数组保存到文本文件中。那我为什么要以二进制模式打开文件呢?

4

2 回答 2

5

因为您的数据是字节(即二进制)数据。

出来的仍然是一个文本文件。不用担心。:-) “文本”文件被定义为仅包含人类可读文本的内容,而不是您打开它的模式。该模式只是在处理给定数据的方式上有所不同。

文本模式意味着它需要 Unicode 数据,它会为您将其编码为字节格式。二进制模式意味着它需要以字节为单位的数据,并且不会对其进行编码。

于 2013-01-21T10:57:37.670 回答
2

很可能是因为 numpy 维护者尚未更新此函数以与 python 3 完全兼容。名称“savetxt”当然意味着纯文本文件就足够了,并且没有什么可以阻止他们调用 fh.write((format % tuple(行)+换行)。编码())。

使用二进制模式也没有什么问题,只是它在某些情况下会导致意外,正如您所发现的那样。如果没有别的,我认为这是 api 设计中的错误。

于 2015-12-15T04:28:22.833 回答