Python - 从SQLite3数据库读取BLOB类型
这是一个关于之前内容的延续:Python - 将十六进制转换为整数/字符
我现在有了一个可以将存储在sqlite3数据库中的IP的十六进制值转换为可读和可用格式的解决方案。不过到目前为止,我一直是通过直接从sqlite3数据库查看器中复制粘贴这些值来进行测试。
我尝试用脚本从数据库中获取这些信息,但我发现它似乎把blob数据存储在一个缓冲区中,这种格式人类无法直接读取。
举个例子,IP地址192.168.0.1在数据库中以blob类型存储,字段名为ip,存储的值是X'C0A80001'。
因为我是在代码中复制粘贴的示例,所以我写了代码来去掉十六进制值中的X'和',以便进行转换。但我无法从数据库中获取这个值(X'C0A80001' <- 这个值我可以通过数据库管理工具查看到)。我搜索后发现了这个链接,里面展示了如何在sqlite数据库中读取blob数据的示例,但他们的方法没有成功,出现了错误:
print row[0], str(row[1]).encode('hex') IndexError: tuple index out of range
我对Python还比较陌生,如果我遗漏了什么基础知识,请多多包涵,任何指点或代码示例都将非常感谢。
编辑:哎,我没有粘贴上面示例中的代码;
c = conn.cursor()
c.execute('select ip from item where name = ' + "\'" + host + "\'")
for row in c:
print row[0], str(row[1]).encode('hex')
可能是我对这个问题的理解有些偏差,所以我无法按照我想要的方式读取数据。
更新:根据下面的回答,我修改了我的代码;
rows = c.execute('select ip from item where name= ' + "\"" + host + "\"")
for row in rows:
print str(row[0]).encode("hex")
1 个回答
检查了链接后,最可能的原因是有一行是空的。在第29行,你设置了一个循环来遍历查询的结果。在Python中,这意味着你有一个列表:[item,item2,item3]
,每次循环时,你的row
变量指向下一个项目。
在循环内部,你正在检查当前项目的内容。这些项目都是元组,应该至少有两个条目。但是,如果这些项目中有任何一个没有row[0]
或row[1]
的条目,那么你就会遇到“索引超出范围”的错误。
你没有提供足够的代码来判断为什么会发生这种情况,但为了让代码运行,我建议这样做:
for row in cur.execute("select * from frames"):
try:
print row[0], str(row[1]).encode('hex')
except IndexError, e:
print "IndexError: {0}".format(e)
这样可以遍历整个查询结果,即使其中有一些是错误的。
编辑:我刚看到你的更新,你的问题是变量c没有保存你的查询内容。c.execute('select ip from item where name = ' + "\'" + host + "\'")
返回的是一个列表,但你忽略了它。
原来的例子之所以有效,是因为你在循环中获取了列表,所以它是一个仅在循环上下文中的匿名变量。要修复你的代码:
c = conn.cursor()
rows = c.execute('select ip from item where name = ' + "\'" + host + "\'")
for row in rows:
print row[0], str(row[1]).encode('hex')