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。