python3 如何讀取python2的npy文件
python3讀取python2打包的npy文件會報錯,原因是編碼方式不同,所以隻要在讀取的時候加上編碼方式即可。
解決方法
docs_train = np.load('./data/20news_clean/train.txt.npy', allow_pickle=True, encoding='bytes') docs_test = np.load('./data/20news_clean/test.txt.npy', allow_pickle=True, encoding='bytes')
路徑中的文件是python2打包的。
補充:在Python 3中加載Python 2 .npy文件時出錯
我有.npy文件,它們是使用Python 2.7.9和Numpy版本1.11.3通過命令創建的np.save(‘filename’)。這些文件是在外部計算機上生成的,該外部計算機是我們研究所的linux集群的一部分。
我將文件復制到本地計算機上,以便通過導入它們np.load(‘filename.npy’)。在我的本地計算機上,我正在運行帶有Jupyter-Notebook的Python 3.5.2和Numpy版本1.13.0。
本地操作系統是Ubuntu 16.04.2。
當我嘗試在本地加載文件時,出現錯誤:
ValueError: invalid literal for int() with base 16
瀏覽瞭一些Stackoverflow問題後,我嘗試使用以下方式指定編碼:
np.load('filename.npy',encoding='latin1')
這給出瞭相同的錯誤。encoding=’bytes’產量:
TypeError: can't multiply sequence by non-int of type 'float'
這是Traceback的較大片段:
/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in load(file, mmap_mode, allow_pickle, fix_imports, encoding) 417 else: 418 return format.read_array(fid, allow_pickle=allow_pickle, --> 419 pickle_kwargs=pickle_kwargs) 420 else: 421 # Try a pickle /usr/local/lib/python3.5/dist-packages/numpy/lib/format.py in read_array(fp, allow_pickle, pickle_kwargs) 638 pickle_kwargs = {} 639 try: --> 640 array = pickle.load(fp, **pickle_kwargs) 641 except UnicodeError as err: 642 if sys.version_info[0] >= 3: /usr/local/lib/python3.5/dist-packages/sympy/core/numbers.py in __new__(cls, num, prec) 823 else: 824 _mpf_ = mpmath.mpf( --> 825 S.NegativeOne**num[0]*num[1]*2**num[2])._mpf_ 826 elif isinstance(num, Float): 827 _mpf_ = num._mpf_ TypeError: can't multiply sequence by non-int of type 'float'
我猜想在Python和Numpy版本之間的轉換時,編碼有問題。關於如何導入文件的任何想法?
解決方案
如中所示,*。npy中數據的存儲方式是什麼?,.npy文件為字節碼,如果您在十六進制編輯器中打開一個字節碼,則會看到該文件。
Python 2字節碼.pyc,.pyo文件無法在Python 3中運行,因為虛擬機和編譯器內部版本已隨主要版本更改。
同樣,NumPy的C內部結構和字節碼編譯器在Python 3中也發生瞭變化,從而破壞瞭向後兼容性。(這是有意的,因為字節碼並不是要持續那麼長時間,或者不能與所創建的版本一起使用。)
這些變更的組成意味著,如果不對Python 3的字節碼解釋器和Python 3的NumPy進行大的更改,和/或從Python 2 NumPy字節碼到Python 3的轉譯器,則無法使用這些Python 2 .npy文件。 Python 3。
正如我之前提到的,這有點像X / Y問題。您不應該依賴.npy文件在各個版本之間工作,因為不能保證它們會保持一致,因為它們本質上是易失性格式(例如Python VM字節碼)。
與其對字節碼進行逆向工程以對其進行調試,不如嘗試獲取生成這些文件的源。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Python序列化模塊之pickle與json詳解
- Python常用標準庫詳解(pickle序列化和JSON序列化)
- tensorflow與numpy的版本兼容性問題的解決
- Python序列化與反序列化相關知識總結
- Python3 pickle模塊的使用方法詳細介紹