sqllite db上的fetchall()返回unicode字符串 [Python 2.7]
我在使用fetchall()的时候遇到了一些问题。
我有一个表格是这样定义的:
with bookDB:
bookCur = bookDB.cursor()
bookCur.execute("CREATE TABLE Books(bookID INTEGER PRIMARY KEY, Title TEXT, Author TEXT, Genre TEXT)")
bookCur.close()
现在如果我想根据类型在数据库中搜索书籍,我有以下这段代码:
with bookDB:
bookCur = bookDB.cursor()
bookCur.execute("SELECT * FROM Books WHERE Genre=?",(query,))
booklist=bookCur.fetchall()
book = ''.join(str(i) for i in booklist)
bookCur.close()
return book;
我想把书单中的所有项目连接成一个字符串,并把它赋值给book,但当我这样做的时候,所有的文本字段都是unicode格式(u'TEXTHERE'),而且前后的括号也保留着。我知道我可以使用多次split或者分隔符,但我觉得我一定是哪里做错了。有什么办法可以阻止这种情况发生吗?有什么建议吗?
这是我从fetchall得到的结果:
[(133, u'Jurassic Park', u'Crichton', u'Sci-Fi')]
我想要一个像这样的字符串:
133>>Jurassic Park>>Crichton>>Sci-Fi
以便通过socket发送回去。
非常感谢你的任何帮助。
1 个回答
1
booklist
是一个包含多个 tuple
的列表,这些 tuple
代表数据库中的查询列。通过执行 book = ''.join(str(i) for i in booklist)
,你实际上是在把 booklist
中每个 tuple
的字符串形式连接在一起。
你可以试试下面的做法:
book = '|'.join(['>>'.join(map(str, row)) for row in booklist])
这样做会返回类似这样的结果:
"133>>Jurassic Park>>Crichton>>Sci-Fi|134>>Star Wars>>Crichton>>Sci-Fi"
其中 >>
是列的分隔符,而 |
是行的分隔符。如果你需要其他的分隔符,只需更改字符串即可。
在这段代码中,内部的 join
会把 tuple
(列)连接起来,而外部的 join
则会把 行
连接起来。map(str, row)
是一个小技巧,用来将 tuple
转换成字符串列表,它会对 tuple
中的每个元素应用 str
方法。这样做是必要的,因为如果直接对包含非字符串元素的可迭代对象使用 join
,会导致 TypeError
错误。
希望这对你有帮助!