这是来自以下的后续内容:Python - Converting Hex to INT/CHAR

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

我一直在尝试使用脚本轮询数据库以查找该信息,但是我发现它显然将blob数据存储在缓冲区中,而该缓冲区不能立即被人类读取。

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

因为我将复制和粘贴的示例工作到代码中,所以我构建了将十六进制的X'和'剥离的代码,以便能够对其进行转换。我无法从数据库中获得该值(X'C0A80001'通过搜索,我发现http://eli.thegreenplace.net/2009/05/29/storing-blobs-in-a-sqlite-db-with-pythonpysqlite/显示了一个从sqlite数据库读取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")

最佳答案

检查链接后,似乎最可能的解释是空行。在第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')

10-07 19:11
查看更多