2017-10-06 48 views
1

我有一個包含雙精度值(64位浮點數據)的二進制文件。使用numpy的fromfile使用numpy fromfile和lzma讀取二進制文件打開

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

我期待陣列data1data2的含量相等。

回答

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

+0

感謝您的解決方案/解決方法。我從來沒有試過'frombuffer'。 –

+0

很高興它爲你工作:-)我認爲這是因爲底層數據是字節,但'fromfile'也應該做到這一點: - / –