从SQL数据库中读取二进制数据(图像数据类型)并对其进行充气,Matlab与Python

时间:2012-03-28 08:22:53

标签: python sql sql-server-2008 matlab

完整编辑:

我迫切需要访问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'>

现在我如何给这个bytearray充气呢?我试过了

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

返回正确长度的bytearray,但我需要上面的Matlab代码返回的整数数组。我尝试解码压缩和膨胀的bytearray,但没有成功。

Matlab和pyodbc如何处理SQL中的图像数据类型是否存在差异?如何在Python中检索整数数组?

我在Windows XP上使用Python 2.7.2,pyodbc 3.0.5和Matlab R2011b。

2 个答案:

答案 0 :(得分:1)

听起来你想把东西解压缩成无符号的16位整数?

所以,你有类似的东西:

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

你想要:

[1, 2, 3, 4]

如果是这样,您有几种选择。

如果您打算使用numpy,请考虑使用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模块,但对于像这样的重复数据,它不太理想。

答案 1 :(得分:0)

问题在于使用pyodbc时MS SQL,BLOB被截断为4096字节。 解决方案是在您的查询前加SET TEXTSIZE 2147483647(2GB,理论上最大值为4GB,但这可能会导致32位有符号值出现问题)。

所以你的代码是:

  

cursor.execute(“设置textsize 2147483647从数据库中选择zip   数据库名= 'foobar的'“)

另请参阅:using pyodbc on ubuntu to insert a image field on SQL Server