2014-12-17 24 views
6

Chcę odczytać zrzut Mongo w formacie BSON w Pythonie i przetworzyć dane. Używam Pythona bson package (którego wolałbym używać zamiast mieć zależność pymongo), ale nie wyjaśnia, jak czytać z pliku.Czy czytasz plik BSON w Pythonie?

To co usiłuję:

bson_file = open('statistics.bson', 'rb') 
b = bson.loads(bson_file) 
print b[0] 

Ale otrzymuję:

Traceback (most recent call last): 
    File "test.py", line 11, in <module> 
    b = bson.loads(bson_file) 
    File "/Library/Python/2.7/site-packages/bson/__init__.py", line 75, in loads 
    return decode_document(data, 0)[1] 
    File "/Library/Python/2.7/site-packages/bson/codec.py", line 235, in decode_document 
    length = struct.unpack("<i", data[base:base + 4])[0] 
TypeError: 'file' object has no attribute '__getitem__' 

Co robię źle?

+0

nie wydaje się, że bson.loads oczekuje pliku. – njzk2

+0

(jak wyraźnie zaznaczono w dokumentacji metody "obciążenia".) – njzk2

Odpowiedz

6

Państwa dokumentacja:

> help(bson.loads) 
Given a BSON string, outputs a dict. 

Trzeba zdać ciąg. Na przykład:

> b = bson.loads(bson_file.read()) 
2

loads spodziewa się ciągu znaków (czyli tego, co oznacza "s"), a nie pliku. Spróbuj odczytać z pliku i przekazać wynik do loads.

3

znalazłem ten pracował dla mnie z MongoDB 2.4 pliku BSON i „bson” moduł Pythona:

import bson 
with open('survey.bson','rb') as f: 
    data = bson.decode_all(f.read()) 

Że wróciła listę słowników pasujących dokumentów JSON przechowywane w tej Mongo kolekcja.

f.read() Dane wygląda to w BSON:

>>> rawdata[:100] 
'\x04\x01\x00\x00\x12_id\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02_type\x00\x07\x00\x00\x00simple\x00\tchanged\x00\xd0\xbb\xb2\x9eI\x01\x00\x00\tcreated\x00\xd0L\xdcfI\x01\x00\x00\x02description\x00\x14\x00\x00\x00testing the bu'   
+0

, ale zatwierdzona odpowiedź jest lepszym sposobem na przejście –