2016-07-08 8 views
3

Also habe ich eine dumme Sache gemacht, und vergessen, einige Werte explizit zu konvertieren, die ich in eine SQLite-Datenbank setzte (mit Pythons SQLalchemy). Die Spalte wurde eingerichtet, um eine INT zu speichern, während die Eingabe tatsächlich ein numpy.int64 dtype war.Decoding NumPy int64 binäre Darstellung

Die Werte Ich bin wieder aus der Datenbank immer wie folgt aussehen:

b'\x15\x00\x00\x00\x00\x00\x00\x00'

Es scheint, dass SQLite die binäre Darstellung für diese Werte gegangen und gespeichert hat, anstatt die ganze Zahl selbst.

Gibt es eine Möglichkeit, diese Werte in Python zu entschlüsseln, oder bin ich mit dem Laden aller meiner Daten wieder fest (keine triviale Übung an dieser Stelle)?

Antwort

4

können Sie verwenden struct.unpack():

>>> import struct 
>>> value = struct.unpack('<q', b'\x15\x00\x00\x00\x00\x00\x00\x00') 
>>> value 
(21,) 
>>> value[0] 
21 

, die davon ausgeht, dass die Daten der Little-Endian gespeichert wurden, wie durch die < im unpack() Formatzeichenfolge angegeben ist, und dass es ein signierter „long long“ (8 Byte) wie durch die q spezifiziert. Wenn die Daten sind Big Endian:

>>> struct.unpack('>q', b'\x15\x00\x00\x00\x00\x00\x00\x00') 
(1513209474796486656,) 

Ich stelle mir vor, dass kleine Endian ist in diesem Fall wahrscheinlicher zu sein.

P.S. Ich habe gerade bestätigt, dass wenn ein numpy.int64 in ein SQLite int Feld eingefügt wird, kann es unter Verwendung struct.unpack() abgerufen werden, wie oben gezeigt.

+0

Danke, das funktioniert ein Charme. Die Daten waren in der Tat Little Endian. –