Чтение двоичных данных (тип данных изображения) из базы данных SQL и их раздувание, Matlab vs. Python - PullRequest
1 голос
/ 28 марта 2012

ПОЛНОЕ РЕДАКТИРОВАНИЕ:

Мне срочно нужно получить доступ к Microsoft SQL Server и прочитать сжатые данные с него, делая это с помощью Python. После многих проблем я наконец нашел работающую реализацию Matlab, которая делает свою работу. Однако мне это нужно в Python.

Данные хранятся в типе данных изображения и должны быть распакованы после загрузки. Это работает код Matlab (используя подпрограммы Java), чтобы сделать работу:

connection = actxserver('ADODB.Connection');
conString = 'Provider=SQLOLEDB; Data Source=adress.to.server; Integrated Security=SSPI; Initial Catalog=';
connection.ConnectionString = conString;
connection.CursorLocation = 'adUseClient';
connection.Open();
query_string = 'select Zip from Database where DatabaseName=''foo'' and Item=''bar'' ';
return = connection.Execute(query_string);
row = return.GetRows();
data = row{1};
class(data) % returns uint8
a = java.io.ByteArrayInputStream(data);
b = java.util.zip.InflaterInputStream(a);
isc = com.mathworks.mlwidgets.io.InterruptibleStreamCopier.getInterruptibleStreamCopier();
c = java.io.ByteArrayOutputStream;
isc.copyStream(b,c);
result = typecast(c.toByteArray,'uint16');

result теперь содержит массив целых чисел, которые являются несжатыми желаемыми данными. Я хотел бы добиться того же, используя Python. Вот код, который я использую для извлечения данных:

import pyodbc
connect = pyodbc.connect(Driver="SQL Server", Server="address.to.server")
cursor = connect.cursor()
cursor.execute("select Zip from database where DatabaseName='foo' and Item='bar'")
row = cursor.fetchone()
data = row[0] 
type data # returns <type 'bytearray'>

Теперь, как мне накачать этот байт-массив? Я пытался

zlib.decompress(io.BytesIO(data).read())

, который возвращает байтовый массив правильной длины, но мне нужен массив целых чисел, которые возвращаются приведенным выше кодом Matlab. Я попытался декодировать сжатый и раздутый байт-массив, но безуспешно.

Есть ли разница в том, как Matlab и pyodbc обрабатывают тип данных изображения в SQL? Как я могу получить массив целых чисел в Python?

Я использую Python 2.7.2, pyodbc 3.0.5 и Matlab R2011b в Windows XP.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Похоже, вы хотите распаковать вещи в 16-разрядные целые числа без знака?

Итак, у вас есть что-то вроде:

bytearray(b'\x01\x00\x02\x00\x03\x00\x04\x00')

И вы хотите:

[1, 2, 3, 4]

Если это так, у вас есть несколько вариантов.

Если вы все равно собираетесь использовать numpy, подумайте об этом.

import numpy as np
dat = bytearray(b'\x01\x00\x02\x00\x03\x00\x04\x00')
data = np.frombuffer(buffer(dat), dtype=np.uint16)

В качестве альтернативы, вы можете сделать что-то вроде этого, используя встроенный в Python array:

import array
dat = bytearray(b'\x01\x00\x02\x00\x03\x00\x04\x00')
data = array.array('H')
data.fromstring(buffer(dat))

Вы также можете использовать модуль struct, но он не идеален для повторенияданные как это.

0 голосов
/ 28 марта 2012

Проблема в том, что при использовании MS SQL при использовании pyodbc большие двоичные объекты усекаются до 4096 байт.Решение состоит в том, чтобы добавить ваш запрос SET TEXTSIZE 2147483647 (2 ГБ, теоретически максимальный - 4 ГБ, но это может вызвать некоторые проблемы с 32-разрядными знаковыми значениями).

Таким образом, ваш код будет:

cursor.execute ("установить текстовый размер 2147483647 выберите zip из базы данных, где DatabaseName = 'foobar'")

Смотрите также: использование pyodbc в Ubuntu для вставки поля изображения на SQL Server

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...