Frage

Ich arbeite in Python mit MongoDB und versuche, ein Array von Floats eng zu speichern.

Ich kann Richtig erstellen und speichern *

Aber Ich kann die Daten nicht in einem brauchbaren Format abrufen.

>>> import random, array, pymongo
>>> from bson.binary import Binary as BsonBinary
>>> con = pymongo.Connection('localhost', 27017)
>>> mm = con['testDatabase']
>>> vals = [random.random() *100 for x in range(1, 5)]
>>> vals
[2.9962593, 64.5582810776, 32.3781311717, 82.0606953423]
>>> varray = array.array('f', vals)
>>> varray
array('f', [2.9962593, 64.5582810776, 32.3781311717, 82.0606953423])
>>> vstring = varray.tostring()
>>> vstring
'\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B'
>>> vbson = BsonBinary(vstring, 5)
>>> vbson
Binary('\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B', 5)
>>> doc1 = { 'something': 1 , 'else' : vbson}
>>> doc1
{'something': 1, 'else': Binary('\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B', 5)}
>>> mm.test1.insert(doc1)
ObjectID('530f7af1d809d80d3db1f635')
>>> gotdoc = mm.test1.find_one()
>>> gotdoc
{u'_id': ObjectId('530f7af1d809d80d3db1f635'), u'something': 3, u'else': Binary('\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B', 5)}
>>> gotfield = gotdoc['else']
>>> gotfield
Binary('\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B', 5)
>>> from bson import BSON
>>> BSON.decode(gotfield)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method decode() must be called with BSON instance as first argument (got Binary instance instead)
>>> gotfield.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position 0: ordinal not in range(128)
>>>

Sobald ich meinen Python-String zurückbekomme, kann ich mein Array aus zufälligen Gleitkommazahlen zurückbekommen.Aber wie?

War es hilfreich?

Lösung

Gehen wir die Fehler durch:

  1. Der erste Fehler erscheint einfach, weil Sie ein tatsächliches BSON-Objekt benötigen.Beachten Sie, dass Sie beim Erstellen noch nie Daten kodiert haben bson.binary.Binary Objekt bedeutet nicht Aufrufen BSON.encode().

  2. Und hier betrügt Sie PyMongo ein wenig.Der bson.binary.Binary ist ein Laufzeit-Patch str oder bytes Instanz (siehe Quelle).Deshalb erhalten Sie den zweiten Fehler:was du nennst, ist tatsächlich str.decode(), nicht BSON.decode().Also, gotfield enthält die zufälligen Float-Daten, die Sie ursprünglich gespeichert haben, aber das Objekt selbst verfügt über einige andere Methoden (z. B. repr()) daran gebunden.

Andere Tipps

Ich komme ~ Ich finde nur einen Weg.Hoffe, das kann dir irgendwie helfen.

generasacodicetagpre.

Bild speichern:

generasacodicetagpre.

Bild abraten:

generasacodicetagpre.

---- edit ----

Wenn Sie ein Bild von Webserver zurückgeben möchten. DO so:

generasacodicetagpre.

Verwenden array.fromstring für die letzte Dekodierungsstufe.Ich kann so an die gleiche Stelle gelangen, an der Sie sich befinden:

>>> from bson import Binary
>>> import array
>>> gotstring = Binary('\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B', 5)

Und schlussendlich:

>>> a = array.array('f')
>>> a.fromstring(gotstring)
>>> a
array('f', [2.9962594509124756, 64.55828094482422, 32.37813186645508, 82.0606918334961])

Sie müssen das Array vor dem Speichern codieren, und sollte das Array.tostring nicht verwenden.Bitte werfen Sie einen Blick auf die Dokumentation hier .

. generasacodicetagpre.

bson.decode (gotfield)

es hat ein typeError-Problem, und Sie sollten es wie das unten unter

schreiben

bson.decode (BSON.BSON (Gotfield))

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top