【问题标题】:Fetchall() on sqllite db returning unicode strings [Python 2.7]sqlite db 中的 Fetchall() 返回 unicode 字符串 [Python 2.7]
【发布时间】:2014-04-23 11:56:26
【问题描述】:

我在运行 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;

我想加入书单中的所有项目以创建一个分配给书的字符串,但是当我这样做时,所有 TEXT 字段都采用 unicode 格式(u'TEXTHERE')以及前后括号也住。我知道我可以多次使用拆分或分隔符,但一定有我做错了。我该如何阻止这种情况发生?有什么建议吗?

这是我从 fetchall 得到的结果:

[(133, u'Jurassic Park', u'Crichton', u'Sci-Fi')]

我想要这样的字符串

133>>Jurassic Park>>Crichton>>Sci-Fi

通过套接字发回。

非常感谢您的任何帮助。

【问题讨论】:

  • 列表中有几本书,是要将它们全部连接起来还是返回一个已经格式化的列表?

标签: python sqlite python-2.7 unicode


【解决方案1】:

booklist 是一个tuples 列表,表示数据库中的查询列。通过执行book = ''.join(str(i) for i in booklist),您只是将tuples 的字符串表示形式连接到booklist

试试这样的:

book = '|'.join(['>>'.join(map(str, row)) for row in booklist])

这将返回如下内容:

"133>>Jurassic Park>>Crichton>>Sci-Fi|134>>Star Wars>>Crichton>>Sci-Fi" 

其中>> 是列分隔符,| 是行分隔符。如果您需要分隔符的其他表示形式,只需更改字符串文字即可。

在该代码中,内部join 将连接tuples(列),而外部将连接rowsmap(str, row) 是将元组转换为string 对象列表的技巧,将str 方法应用于元组中的每个元素。这是必需的,因为简单地对包含非字符串元素的迭代执行 join 会返回 TypeError 异常。

希望这会有所帮助!

【讨论】:

  • 感谢朋友,它确实有效。请问map()的意义是什么?它在做什么?
  • @cjuf 很高兴,我会更新答案以解释map 的用法。
  • 我现在明白了。再次感谢您的帮助。
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多