Python 3.x 为什么我应该给“savetxt”一个以二进制而不是文本模式打开的文件?

Python 3.x 为什么我应该给“savetxt”一个以二进制而不是文本模式打开的文件?,python-3.x,numpy,Python 3.x,Numpy,我被以下numpy行为所咬: In [234]: savetxt(open('/tmp/a.dat', 'wt'), array([1, 2, 3])) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-234

我被以下
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
[234]中的
:savetxt(打开('/tmp/a.dat',wt'),数组([1,2,3]))
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1 savetxt(打开('/tmp/a.dat',wt'),数组([1,2,3]))
/savetxt中的local/gerrit/python3.2/lib/python3.2/site-packages/numpy/lib/npyio.py(fname、X、fmt、delimiter、换行符)
1007其他:
1008对于X中的行:
->1009 fh.写入(字节(格式%tuple(行)+换行))
1010最后:
1011如果是自有的,则:
TypeError:必须是str,而不是bytes
在[235]中:savetxt(打开('/tmp/a.dat',wb'),数组([1,2,3]))
#成功

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

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

结果仍然是一个文本文件。别担心。:-)“文本”文件定义为仅包含人类可读文本的文件,而不是通过您以何种模式打开它。模式只是在处理给定数据的方式上有所不同


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

最有可能的原因是numpy维护人员尚未将此函数更新为与python 3完全兼容。名称“savetxt”当然意味着一个纯文本文件就足够了,并且没有任何东西阻止他们调用fh.write((格式%tuple(row)+newline).encode()


使用二进制模式也没有什么错,只是在某些情况下会引起意外,正如您所发现的那样。我认为它是API设计中的一个bug,如果没有别的东西。

这可能是NUMPY中的一个bug吗?