我有一个包含双精度值(64位浮点数据)的二进制文件。使用 numpy fromfile
>>> data1 = numpy.fromfile(open('myfile', 'rb'))
我收到正确的数据(我得到的数据与data1 = numpy.fromfile('myfile')
相同)
>>> data1
array([ 1.29000000e-07, 3.70000000e-08, 3.80000000e-08,
3.70000000e-08, 3.60000000e-08, 3.80000000e-08,
3.80000000e-08, 3.70000000e-08, 3.80000000e-08,
3.60000000e-08, 3.80000000e-08, 3.70000000e-08,
3.60000000e-08, 3.60000000e-08, 3.80000000e-08,
3.50000000e-08, 3.80000000e-08, 3.80000000e-08,
3.80000000e-08, 3.60000000e-08, 3.70000000e-08,
3.60000000e-08, 3.70000000e-08, 3.70000000e-08,
3.60000000e-08, 3.50000000e-08, 3.70000000e-08,
3.70000000e-08, 3.60000000e-08, 3.50000000e-08,
3.80000000e-08, 3.80000000e-08, 3.60000000e-08,
3.50000000e-08, 3.90000000e-08, 3.70000000e-08,
3.70000000e-08, 3.70000000e-08, 3.50000000e-08,
3.70000000e-08, 3.60000000e-08, 3.70000000e-08,
3.80000000e-08, 3.90000000e-08, 3.90000000e-08,
3.60000000e-08, 3.60000000e-08, 3.70000000e-08,
3.60000000e-08, 3.80000000e-08, 3.70000000e-08,
3.50000000e-08, 3.50000000e-08, 3.60000000e-08,
3.60000000e-08, 3.70000000e-08, 3.50000000e-08,
3.70000000e-08, 3.60000000e-08, 3.80000000e-08,
3.80000000e-08, 3.80000000e-08, 3.80000000e-08,
3.90000000e-08, 3.90000000e-08, 3.50000000e-08,
3.80000000e-08, 3.80000000e-08, 3.70000000e-08,
3.70000000e-08, 3.60000000e-08, 3.80000000e-08,
3.60000000e-08, 3.70000000e-08, 3.70000000e-08,
3.80000000e-08, 3.60000000e-08, 3.60000000e-08,
3.50000000e-08, 3.80000000e-08, 3.60000000e-08,
3.70000000e-08, 3.60000000e-08, 3.80000000e-08,
3.50000000e-08, 3.80000000e-08, 3.70000000e-08,
3.60000000e-08, 3.70000000e-08, 3.90000000e-08,
3.60000000e-08, 3.60000000e-08, 3.90000000e-08,
3.80000000e-08, 3.60000000e-08, 3.60000000e-08,
3.70000000e-08, 3.70000000e-08])
我现在使用xz
压缩此文件
xz -k myfile
然后尝试使用 Python 模块读取 Python 中的数据lzma
>>> data2 = numpy.fromfile(lzma.open('myfile.xz'))
>>> data2
array([ 2.05244522e-289, 3.09873319e-303, -9.10852154e-136,
9.99900586e-150, -7.22647881e+061, -3.03508634e-168,
1.40409926e+097, -8.66961452e+219, 2.28992199e-308,
-7.28706929e+173, 1.41101250e+029, -2.94590886e-279,
7.21680144e+171, -4.62715868e+045, 3.05536517e-138,
-2.94268247e-043, -1.54563603e-295, 7.53024241e+102,
-1.22865109e+263, 2.62485731e+044, 4.52556260e-312,
1.18164036e-240, 3.56496646e-311, -2.82751232e+286,
1.69336097e+127])
为什么会这样?通过read
查看文件对象的内容给出了
>>> open('myfile', 'rb').read()
b'B$xf7xffgPx81>x1cxe8lxc4=xddc>xd1x1exae#xaefd>x1cxe8lxc4=xddc>gxb1+excdSc>xd1x1exae#xaefd>xd1x1exae#xaefd>x1cxe8lxc4=xddc>xd1x1exae#xaefd>gxb1+excdSc>xd1x1exae#xaefd>x1cxe8lxc4=xddc>gxb1+excdSc>gxb1+excdSc>xd1x1exae#xaefd>xb3zxeax05]xcab>xd1x1exae#xaefd>xd1x1exae#xaefd>xd1x1exae#xaefd>gxb1+excdSc>x1cxe8lxc4=xddc>gxb1+excdSc>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>gxb1+excdSc>xb3zxeax05]xcab>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>gxb1+excdSc>xb3zxeax05]xcab>xd1x1exae#xaefd>xd1x1exae#xaefd>gxb1+excdSc>xb3zxeax05]xcab>x85Uxefx82x1exf0d>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>xb3zxeax05]xcab>x1cxe8lxc4=xddc>gxb1+excdSc>x1cxe8lxc4=xddc>xd1x1exae#xaefd>x85Uxefx82x1exf0d>x85Uxefx82x1exf0d>gxb1+excdSc>gxb1+excdSc>x1cxe8lxc4=xddc>gxb1+excdSc>xd1x1exae#xaefd>x1cxe8lxc4=xddc>xb3zxeax05]xcab>xb3zxeax05]xcab>gxb1+excdSc>gxb1+excdSc>x1cxe8lxc4=xddc>xb3zxeax05]xcab>x1cxe8lxc4=xddc>gxb1+excdSc>xd1x1exae#xaefd>xd1x1exae#xaefd>xd1x1exae#xaefd>xd1x1exae#xaefd>x85Uxefx82x1exf0d>x85Uxefx82x1exf0d>xb3zxeax05]xcab>xd1x1exae#xaefd>xd1x1exae#xaefd>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>gxb1+excdSc>xd1x1exae#xaefd>gxb1+excdSc>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>xd1x1exae#xaefd>gxb1+excdSc>gxb1+excdSc>xb3zxeax05]xcab>xd1x1exae#xaefd>gxb1+excdSc>x1cxe8lxc4=xddc>gxb1+excdSc>xd1x1exae#xaefd>xb3zxeax05]xcab>xd1x1exae#xaefd>x1cxe8lxc4=xddc>gxb1+excdSc>x1cxe8lxc4=xddc>x85Uxefx82x1exf0d>gxb1+excdSc>gxb1+excdSc>x85Uxefx82x1exf0d>xd1x1exae#xaefd>gxb1+excdSc>gxb1+excdSc>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>'
>>> lzma.open('myfile.xz').read()
b'B$xf7xffgPx81>x1cxe8lxc4=xddc>xd1x1exae#xaefd>x1cxe8lxc4=xddc>gxb1+excdSc>xd1x1exae#xaefd>xd1x1exae#xaefd>x1cxe8lxc4=xddc>xd1x1exae#xaefd>gxb1+excdSc>xd1x1exae#xaefd>x1cxe8lxc4=xddc>gxb1+excdSc>gxb1+excdSc>xd1x1exae#xaefd>xb3zxeax05]xcab>xd1x1exae#xaefd>xd1x1exae#xaefd>xd1x1exae#xaefd>gxb1+excdSc>x1cxe8lxc4=xddc>gxb1+excdSc>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>gxb1+excdSc>xb3zxeax05]xcab>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>gxb1+excdSc>xb3zxeax05]xcab>xd1x1exae#xaefd>xd1x1exae#xaefd>gxb1+excdSc>xb3zxeax05]xcab>x85Uxefx82x1exf0d>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>xb3zxeax05]xcab>x1cxe8lxc4=xddc>gxb1+excdSc>x1cxe8lxc4=xddc>xd1x1exae#xaefd>x85Uxefx82x1exf0d>x85Uxefx82x1exf0d>gxb1+excdSc>gxb1+excdSc>x1cxe8lxc4=xddc>gxb1+excdSc>xd1x1exae#xaefd>x1cxe8lxc4=xddc>xb3zxeax05]xcab>xb3zxeax05]xcab>gxb1+excdSc>gxb1+excdSc>x1cxe8lxc4=xddc>xb3zxeax05]xcab>x1cxe8lxc4=xddc>gxb1+excdSc>xd1x1exae#xaefd>xd1x1exae#xaefd>xd1x1exae#xaefd>xd1x1exae#xaefd>x85Uxefx82x1exf0d>x85Uxefx82x1exf0d>xb3zxeax05]xcab>xd1x1exae#xaefd>xd1x1exae#xaefd>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>gxb1+excdSc>xd1x1exae#xaefd>gxb1+excdSc>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>xd1x1exae#xaefd>gxb1+excdSc>gxb1+excdSc>xb3zxeax05]xcab>xd1x1exae#xaefd>gxb1+excdSc>x1cxe8lxc4=xddc>gxb1+excdSc>xd1x1exae#xaefd>xb3zxeax05]xcab>xd1x1exae#xaefd>x1cxe8lxc4=xddc>gxb1+excdSc>x1cxe8lxc4=xddc>x85Uxefx82x1exf0d>gxb1+excdSc>gxb1+excdSc>x85Uxefx82x1exf0d>xd1x1exae#xaefd>gxb1+excdSc>gxb1+excdSc>x1cxe8lxc4=xddc>x1cxe8lxc4=xddc>'
这对我来说看起来不错。类型似乎也正确:
>>> type(data1)
<class 'numpy.ndarray'>
>>> type(data1[0])
<class 'numpy.float64'>
>>> type(data2)
<class 'numpy.ndarray'>
>>> type(data2[0])
<class 'numpy.float64'>
我希望数组data1
和data2
的内容相等。
所以,我不知道解决方案的原因,但我有一个。我从 tofile 方法生成了一个文件。
我用frombuffer
阅读了压缩版本.
data_xz = np.frombuffer(lzma.open('data.bin.xz', mode='rb').read())
data_bin = np.fromfile('data.bin')
并且读取时数据相等。
我的猜测是,在某个地方,np.fromfile
对读取字节的处理揭示了普通读取方法和 lzma 模块中的方法的不同。
无论如何,最好使用一致的格式来存储数据。对于小型数据集,纯文本是可以的。另外,还有joblib的持久性模块或用于Python的HDF5。