Python SQLite3:存储的Blob无法转回bytes的问题求助
解决SQLite Blob数据读取后无法转回bytes的问题
问题背景
在SQLite3中定义"bytes_as_blob" BLOB列,使用sqlite3.Binary(some_data)存储字节数据后,DB Browser显示为<memory at 0x000002157DA24F40>;通过pd.read_sql_query读取数据到DataFrame时,bytes_as_blob列类型为object,实际存储的是<class 'str'>,无法直接转回原始bytes。
原因分析
pandas的read_sql_query默认会将SQLite返回的memoryview对象(由sqlite3.Binary存储的Blob数据)转换为字符串(显示为对象的repr),而非保留bytes类型,导致无法直接还原原始字节数据。
解决方案
方案1:手动处理查询结果再构造DataFrame
直接通过sqlite3游标执行查询,手动将memoryview转换为bytes后再生成DataFrame:
import sqlite3 import pandas as pd conn = sqlite3.connect('your_db.db') sql_statement = "SELECT uid, bytes_as_blob from a_table LIMIT 10" # 执行查询并处理Blob列 cursor = conn.cursor() cursor.execute(sql_statement) rows = cursor.fetchall() # 将每个Blob字段的memoryview转为bytes processed_rows = [(row[0], bytes(row[1])) for row in rows] # 构造DataFrame df = pd.DataFrame(processed_rows, columns=['uid', 'bytes_as_blob']) # 验证类型 print(f"type(df.loc[1, 'bytes_as_blob']) = {type(df.loc[1, 'bytes_as_blob'])}") # 输出 <class 'bytes'>
方案2:使用pandas的converters参数指定转换逻辑
在read_sql_query中通过converters参数,为bytes_as_blob列指定转换函数:
import pandas as pd import sqlite3 def convert_blob(blob_obj): # 若为memoryview则转为bytes,兼容其他情况 if isinstance(blob_obj, memoryview): return bytes(blob_obj) return blob_obj conn = sqlite3.connect('your_db.db') sql_statement = "SELECT uid, bytes_as_blob from a_table LIMIT 10" # 读取时指定转换器 df = pd.read_sql_query(sql_statement, conn, converters={'bytes_as_blob': convert_blob}) # 验证类型 print(f"type(df.loc[1, 'bytes_as_blob']) = {type(df.loc[1, 'bytes_as_blob'])}") # 输出 <class 'bytes'>
方案3:确认存储逻辑正确性
确保存储时确实使用sqlite3.Binary包装原始bytes数据,避免因存储错误导致读取异常:
some_data = b'your_original_byte_data' conn.execute("INSERT INTO a_table (uid, bytes_as_blob) VALUES (?, ?)", (1, sqlite3.Binary(some_data))) conn.commit()
补充说明
DB Browser显示的<memory at ...>是memoryview对象的字符串表示,属于正常现象,不影响数据的完整性,只要读取时正确转换即可还原原始字节。
内容的提问来源于stack exchange,提问作者rahul
相关产品推荐
相关产品推荐

