2014-12-17 4 views
6

Я хочу прочитать формат Mongo для BSON в Python и обработать данные. Я использую Python bson package (который я бы предпочел использовать, а не зависимость pymongo), но он не объясняет, как читать из файла.Прочитать файл BSON в Python?

Это то, что я пытаюсь:

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

Но я получаю:

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

Что я делаю неправильно?

+0

не кажется, что bson.loads ожидает файл. – njzk2

+0

(как ясно указано в документации метода 'load'.) – njzk2

ответ

6

В документации говорится:

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

Вам нужно передать строку. Например:

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

loads ожидает строку (это то, что означает 's'), а не файл. Попробуйте прочитать из файла и передайте результат loads.

3

Я нашел, что это работает для меня с MongoDB 2.4 BSON файла и модуль «BSON» питона:

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

, возвращающего список словарей, соответствующих JSON документы, сохраненные в этой Монго коллекция.

Данные f.read() выглядит следующим образом в 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

, но одобренный ответ - лучший способ пойти –

Смежные вопросы