使用numpy fromfile结合lzma open读取二进制文件

时间:2017-10-06 08:41:22

标签: python python-3.x numpy lzma

我有一个二进制文件,其中包含双值(64位浮点数据)。使用numpy GlideApp

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中读取数据
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$\xf7\xffgP\x81>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\x85U\xef\x82\x1e\xf0d>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>\x85U\xef\x82\x1e\xf0d>\x85U\xef\x82\x1e\xf0d>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\xb3z\xea\x05]\xcab>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x85U\xef\x82\x1e\xf0d>\x85U\xef\x82\x1e\xf0d>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x85U\xef\x82\x1e\xf0d>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x85U\xef\x82\x1e\xf0d>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>'
>>> lzma.open('myfile.xz').read()
b'B$\xf7\xffgP\x81>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\x85U\xef\x82\x1e\xf0d>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>\x85U\xef\x82\x1e\xf0d>\x85U\xef\x82\x1e\xf0d>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\xb3z\xea\x05]\xcab>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x85U\xef\x82\x1e\xf0d>\x85U\xef\x82\x1e\xf0d>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x85U\xef\x82\x1e\xf0d>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x85U\xef\x82\x1e\xf0d>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>'

我希望数组>>> type(data1) <class 'numpy.ndarray'> >>> type(data1[0]) <class 'numpy.float64'> >>> type(data2) <class 'numpy.ndarray'> >>> type(data2[0]) <class 'numpy.float64'> data1的内容相等。

1 个答案:

答案 0 :(得分:1)

所以,我不知道解决方案的为什么,但我有一个。我使用tofile方法生成了一个文件。

我用frombuffer读取了压缩版本。

data_xz = np.frombuffer(lzma.open('data.bin.xz', mode='rb').read())
data_bin = np.fromfile('data.bin')

,读数时数据相同。

我的猜测在某处,np.fromfile读取字节的处理揭示了普通读取方法与lzma模块中的读取方法的区别。

无论如何,最好使用一致的格式来存储数据。对于小数据集,纯文本是可以的。此外,还有joblib的persistence moduleHDF5 for Python