2012-09-04 27 views
2

我習慣於使用JSON和Numpy在python中存儲數組,列表和字典,但是我想使用BSON,因爲浮點數只佔用4個字節,因此減少文件大小。在Python中使用BSON將浮點數組序列化/反序列化爲二進制文件

使用JSON,我做了以下內容:

import numpy 
import json 

a = numpy.random.rand(12).reshape((3,4)) 

with open('out.json', 'w') as out: 
    json.dump(a.tolist(), out) 

with open('out.json') as inp: 
    b = numpy.array(json.load(inp)) 

print b 

我沒有找到一個明顯的方式做同樣的BSON。我嘗試這樣做:

import numpy 
from bson import BSON 

a = numpy.random.rand(12).reshape((3,4)) 

b = BSON.encode({'a': a.tolist()}) 

with open('out.bson', 'wb') as out: 
    out.write(b) 

with open('out.bson', 'rb') as inp: 
    print BSON().decode(inp.read()) 

但得到這個錯誤:

Traceback (most recent call last): 
    File "apaga.py", line 12, in <module> 
    print BSON().decode(inp.read()) 
    File "/usr/lib/python2.7/dist-packages/bson/__init__.py", line 539, in decode 
    (document, _) = _bson_to_dict(self, as_class, tz_aware) 
bson.errors.InvalidBSON: not enough data for a BSON document 

回答

2

我已經安裝了,如圖所以也許我使用的是不同的版本將不會導入BSON的版本。要查看導入後的Python類型的幫助(BSON)你的文檔......

像這樣的東西應該工作:

import bson 
>>> a = numpy.random.rand(12).reshape((3,4)) 
>>> b = bson.dumps({'a':a.tolist()}) 
>>> print bson.loads(b) 
{u'a': [[0.033390565943162254, 0.7282666963459123, 0.03719924011978737, 0.2664821209717694], [0.6145164300761253, 0.3662769247564551, 0.5973843055182299, 0.42908933503924207], [0.05901830243140804, 0.31533731904861184, 0.7158207045507905, 0.12686922689849378]]} 
+1

它甚至沒有工作,因爲BSON模塊沒有'dumps'功能。 – heltonbiker

+1

@heltonbiker:實際上,如果使用正確版本的bson,它確實有效。我發現DrSkippy的代碼與bson-0.3.3一起工作。 – mhawke

+0

好的,我看到了...無論如何,我很容易修改bson.SON對象以從對象字符串和相反的對象獲取二進制表示。 – heltonbiker

相關問題