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のメンテナがこの関数をPython3と完全に互換性があるように更新していないことが原因である可能性があります。「savetxt」という名前は、テキストのみのファイルで十分であることを意味し、fh.write((format%tuple(行)+改行).encode())。

バイナリモードを使用しても問題はありませんが、ご存知のように、場合によっては驚きにつながることもあります。他に何もないとしても、それはAPI設計のバグだと思います。

于 2015-12-15T04:28:22.833 に答える