从SQL数据库读取二进制数据(图像数据类型)并将其膨胀,Matlab vs.Python

2024-10-03 23:28:25 发布

您现在位置:Python中文网/ 问答频道 /正文

完全编辑:

我迫切需要使用Python访问microsoftsqlserver并从中读取压缩数据。在经历了很多麻烦之后,我终于找到了一个可以工作的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实现同样的功能。以下是我用来检索数据的代码:

^{pr2}$

现在我该怎么充气?我试过了

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

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

Matlab和pyodbc如何处理SQL中的图像数据类型有区别吗?如何在Python中检索整数数组?在

我在WindowsXP上使用Python2.7.2、pyodbc 3.0.5和MatlabR2011B。在


Tags: 数据代码io图像datastringreturn整数
2条回答

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

所以,你有这样的东西:

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

你想要:

^{pr2}$

如果是这样,你有几个选择。在

如果你要使用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模块,但对于这样的重复数据,它并不理想。在

问题是在使用pyodbc时使用MS-SQL时,blob被截断为4096个字节。 解决方案是预先添加查询SET TEXTSIZE 2147483647(2GB,理论上最大值是4GB,但这可能会导致32位有符号值的一些问题)。在

所以你的代码应该是:

cursor.execute("set textsize 2147483647 select zip from database where DatabaseName='foobar'")

{a1}另见}

相关问题 更多 >