splite3存取numpy数组的方法

时间:2022-02-19 21:43:55

splite3中直接采用blob数据类型存取numpy数组,无法测试通过,会的大牛请在评论区留言,谢谢。

经过查找英文资料,得出了splite3存取numpy数组的方法,现在分享给大家如下:

import sqlite3
import numpy as np
import io
import zlib

compressor = zlib.compressobj(1)
decompressor = zlib.decompressobj()

def adapt_array(arr):

out = io.BytesIO()
np.save(out, arr)
out.seek(0)

dataa=out.read()
#压缩数据流
return sqlite3.Binary(zlib.compress(dataa, zlib.Z_BEST_COMPRESSION))

def convert_array(text):
out = io.BytesIO(text)
out.seek(0)

dataa=out.read()
#解压缩数据流
out = io.BytesIO(zlib.decompress(dataa))
return np.load(out)

sqlite3.register_adapter(np.ndarray, adapt_array)
sqlite3.register_converter("array", convert_array)



def test_save_sqlite_arrays():



con = sqlite3.connect("e:/t1")
cur = con.cursor()
cur.execute('create table catalog (des array)')


des1 =[[16,25,23],[54,23,78]]
des2 =[[26,12,18]]


print(type(des1))

de1=adapt_array(des1)

print(type(de1))

de2=adapt_array(des2)

cur.execute("insert into catalog (des) values(?)",(de1,))
cur.execute("insert into catalog (des) values(?)",(de2,))
con.commit()
con.close()


def test_load_sqlite_arrays():
con = sqlite3.connect("e:/t1")
cur = con.cursor()

cur.execute('select des from catalog')

origin = cur.fetchall()


data1=origin[0][0]
data1=convert_array(data1)

print(data1)
print(len(data1))
print(type(data1))

data2=origin[1][0]
data2=convert_array(data2)

print(data2)
print(len(data2))
print(type(data2))



cur.execute('DROP TABLE catalog')
con.commit()
con.close()


if __name__ == '__main__':
test_save_sqlite_arrays()
test_load_sqlite_arrays()

说明:

使用环境:python3.6+win7

以上代码,假设文件名为:test.py,

在windows下的cmd下,进入test.py文件的存取目录,执行如下命令即可:

python test.py

下面是部分代码解释:

import zlib  #用于压缩数据,缩小存储空间。

con = sqlite3.connect("e:/t1")  #链接数据库,地址可以自己更改。

zlib.compress(dataa, zlib.Z_BEST_COMPRESSION)  #用于压缩数据dataa,“zlib.Z_BEST_COMPRESSION”为最优压缩。

原创部分:在python3.6+win7环境下,采用了不同的压缩解压方式。

以上部分代码抄了英文资料,链接:https://*.com/questions/18621513/python-insert-numpy-array-into-sqlite3-database。