Fro*_*ame 12 python numpy python-3.x python-unicode
我正在尝试加载/usr/share/matplotlib/sample_data/goog.npy:
datafile = matplotlib.cbook.get_sample_data('goog.npy', asfileobj=False)
np.load(datafile)
Run Code Online (Sandbox Code Playgroud)
它在Python 2.7中很好,但在Python 3.4中引发了异常:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd4 in position 1: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
我认为它与bytes/str/unicodePython 2和3之间的不一致有关,但不知道如何通过.
题:
.npy从Python 3中的Python 2 加载文件(NumPy数据)?问题在于该文件包含序列化(腌制)的Python日期时间对象,而不仅仅是数字数据。这些对象的Python序列化格式在Py2和Py3之间不兼容:
python2
>>> import pickle
>>> pickle.dumps(datetime.datetime.now())
"cdatetime\ndatetime\np0\n(S'\\x07\\xde\\x06\\t\\x0c\\r\\x19\\x0f\\x1fP'\np1\ntp2\nRp3\n."
Run Code Online (Sandbox Code Playgroud)
和
python3
>>> import pickle
>>> pickle.loads(b"cdatetime\ndatetime\np0\n(S'\\x07\\xde\\x06\\t\\x0c\\r\\x19\\x0f\x1fP'\np1\ntp2\nRp3\n.")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xde in position 1: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
解决方法是更改Numpy代码内部
numpy/lib/format.py:
...
446 array = pickle.load(fp)
Run Code Online (Sandbox Code Playgroud)
到array = pickle.load(fp, encoding="bytes")。更好的解决方案是允许numpy.load传递编码参数。
在numpy 1.10.4的python 3.5中,使用以下命令对我有效;
D = np.load(file, encoding = 'latin1')
Run Code Online (Sandbox Code Playgroud)
当我不指定编码时,它将失败,并显示相同的错误消息。