Python - 从SQLite3 DB读取BLOB类型

时间:2011-09-29 13:03:25

标签: python sqlite binary hex

以下是:Python - Converting Hex to INT/CHAR

我现在有了一个工作解决方案,用于将存储的IP的数据从sqlite3数据库转换为可读和可用的格式。但是到目前为止,我一直在通过直接从sqlite3 db viewer复制和粘贴值进行测试。

我一直在尝试使用脚本轮询数据库来查找该信息,但是我发现它可以将blob数据存储到缓冲区中,而这个缓冲区并不是人类可读的。

例如,IP 192.168.0.1在字段ip下以blob类型存储为X'C0A80001'

由于我从一个复制和粘贴的例子到我的代码中工作,我已经构造了代码来从十六进制中剥离X'和'然后能够转换它。我无法得到的是数据库中的值(X'C0A80001'< - 我可以使用数据库管理器查看的这个值)。 搜索我发现http://eli.thegreenplace.net/2009/05/29/storing-blobs-in-a-sqlite-db-with-pythonpysqlite/显示了一个从sqlite db读取blob的示例,但是他们的方法不起作用。他们显示错误;

print row[0], str(row[1]).encode('hex')
IndexError: tuple index out of range

我是Python的新手,所以如果我遗漏了一些基本的东西,但任何指针或代码示例,任何人都必须帮我理解这一点,我会很感激。

编辑: Doh,没有粘贴上面例子中的代码;

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 个答案:

答案 0 :(得分:3)

检查链接后,似乎最可能的解释是空行。在第29行,您设置了一个for循环来检查查询的结果。在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 + "\'")会返回一个您忽略的列表。

原始示例有效,因为您在for循环中获取了列表,因此它只是在循环上下文中的匿名变量。修复你的代码:

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')