阅读从SQL数据库二进制数据(图像数据类型)和它充气,MATLAB对Python的

问题描述:

FULL编辑:阅读从SQL数据库二进制数据(图像数据类型)和它充气,MATLAB对Python的

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

什么数据类型是zip列?你有哪些版本的Python和pyodbc? – Pondlife 2012-03-28 09:18:39

+0

它可能不是一个zip文件,而是一些其他压缩格式,例如'compress','gzip','tgz'或原始LZ或LZW压缩数据。 – Ben 2012-03-28 09:34:10

+0

我被告知它是由数据库管理员提供的zip文件。 @Pondlife我在问题文本中澄清。 – 2012-03-28 10:21:57

这听起来像你想解压缩到无符号的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模块,但它不是很理想像这样的重复数据。

+0

谢谢!这终于奏效了! – 2012-04-04 07:13:00

问题是,使用pyodbc时,MS SQL被截断为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

+0

不幸的是,这并没有解决问题。这两种情况下的文件大小也是相同的,所以看起来问题不在于截断。 – 2012-04-02 10:52:11