我被以下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
我发现这很奇怪。我试图将我的数组保存到 text 文件中。那我为什么要在二进制模式下打开文件?
答案 0 :(得分:4)
因为您的数据是字节(即二进制)数据。
出来的内容仍然是文本文件。别担心。 :-)“文本”文件定义为仅包含人类可读文本的内容,而不是您打开它的模式。该模式只会对处理给定数据的方式产生影响。
文本模式意味着它需要Unicode数据,它会将它编码为字节格式。二进制模式意味着它需要以字节为单位的数据,并且不会对其进行编码。
答案 1 :(得分:1)
最有可能的原因是numpy维护者没有更新此函数以与python 3完全兼容。名称“savetxt”肯定意味着纯文本文件就足够了,没有什么能阻止他们调用fh.write((格式) %元组(行)+换行符.encode())。
使用二进制模式也没有错,除非它在某些情况下会导致意外,正如您所发现的那样。我认为这是api设计中的一个错误,如果没有别的。