阅读从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。
这听起来像你想解压缩到无符号的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
模块,但它不是很理想像这样的重复数据。
谢谢!这终于奏效了! – 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
不幸的是,这并没有解决问题。这两种情况下的文件大小也是相同的,所以看起来问题不在于截断。 – 2012-04-02 10:52:11
什么数据类型是zip列?你有哪些版本的Python和pyodbc? – Pondlife 2012-03-28 09:18:39
它可能不是一个zip文件,而是一些其他压缩格式,例如'compress','gzip','tgz'或原始LZ或LZW压缩数据。 – Ben 2012-03-28 09:34:10
我被告知它是由数据库管理员提供的zip文件。 @Pondlife我在问题文本中澄清。 – 2012-03-28 10:21:57