2013-01-21 93 views
4

我被咬通過以下numpy行爲:爲什麼我應該給`savetxt`打開一個二進制文件而不是文本模式的文件?

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 

我覺得這很奇怪。我試圖將我的陣列保存到文本文件中。那我爲什麼要打開二進制文件模式?

+0

也許這是Numpy中的錯誤? –

回答

4

因爲您的數據是字節(即二進制)數據。

什麼出來仍然是一個文本文件。別擔心。 :-)「文本」文件被定義爲只包含人類可讀文本的東西,而不是以您打開它的模式。該模式在處理所給出的數據方面只是有所不同。

文本模式意味着它需要Unicode數據,並且它會將它編碼爲字節格式。二進制模式意味着它期望以字節爲單位的數據,並且不會對它進行編碼。

1

很可能是因爲numpy的維護者沒有更新這個函數來完全兼容python 3.一個名字「savetxt」肯定意味着一個純文本文件就足夠了,沒有什麼能夠阻止他們調用fh.write((格式%tuple(row)+換行符).encode())。

使用二進制模式沒有什麼問題,除非它在某些情況下會導致驚奇,就像您發現的那樣。如果沒有別的,我認爲它是api設計中的一個錯誤。

相關問題