完整编辑:
我迫切需要访问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。
答案 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