【问题标题】:Reading binary file using numpy fromfile in combination with lzma open使用 numpy fromfile 结合 lzma open 读取二进制文件
【发布时间】:2017-10-06 08:41:22
【问题描述】:

我有一个包含双精度值(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

随后尝试使用lzma 模块在python 中读取数据

>>> 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'>

我希望数组data1data2 的内容相等。

【问题讨论】:

    标签: python python-3.x numpy lzma


    【解决方案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

    【讨论】:

    • 感谢您的解决方案/解决方法。我永远不会尝试frombuffer
    • 很高兴它对你有用 :-) 我认为底层数据是字节,但 fromfile 也应该这样做 :-/
    猜你喜欢
    • 2014-09-20
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    相关资源
    最近更新 更多