如何在Python中从sqlite3 cursor.fetchall()中删除“u”

15
import sqlite3
class class1:
def __init__(self):
    self.print1()
def print1(self):
    con = sqlite3.connect('mydb.sqlite')
    cur = con.cursor()
    cur.execute("select fname from tblsample1 order by fname")
    ar=cur.fetchall()
    print(ar)

class1()

输出结果如下所示

[(u'arun',), (u'kiran',), (u'kulku',), (u'sugu',)]
我需要从数组中移除u,并且需要按照以下方式输出。
['arun', 'kiran', 'kulku', 'sugu']
4个回答

24
如果您需要从SQLite数据库检索的字符串以UTF-8格式返回而不是Unicode,请使用text_factory属性设置您的连接。
import sqlite3
class class1:
def __init__(self):
    self.print1()
def print1(self):
    con = sqlite3.connect('mydb.sqlite')
    con.text_factory = str
    cur = con.cursor()
    cur.execute("select fname from tblsample1 order by fname")
    ar=cur.fetchall()
    print(ar)

class1()

请参考以下详细信息: http://docs.python.org/library/sqlite3.html#sqlite3.Connection.text_factory

这将处理您字符串前面的“u”。然后,您需要将元组列表转换为列表:

ar=[r[0] for r in cur.fetchall()]

10
u前缀表示字符串是Unicode字符串。如果您确定该字符串是基本的ASCII字符串,则可以使用简单的str()将Unicode字符串转换为非Unicode字符串。

示例:

unicode_foo = u"foo"
print unicode_foo
>>> u"foo"

print str(unicode_foo)
>>> "foo"

在您的情况下,由于有一组元组,您需要使用Python列表推导式来完成此操作:

ar = [[str(item) for item in results] for results in cur.fetchall()]

其中resultsfetchall返回的元组列表,而item则是元组的成员。


请给我解释一下 ar = [str(item[0]) for item in cur.fetchall()],谢谢。 - KIRAN K J
@KIRAN:我编辑了我的答案,将fetchall方法返回的所有项目进行了转换。 - Cédric Julien

2

“u”告诉你这些是Unicode字符串。如果想以指定的格式打印元组列表,您可以使用以下代码:

>>> myformat="['%s']"%"', '".join([t[0] for t in ar])
>>> print myformat
['arun', 'kiran', 'kulku', 'sugu']

编辑:// 在结果集中,带有u和逗号的KIRAN的示例:

>>> ar=[(u'u',), (u'u',), (u',,,u,,u,',)]
>>> myformat="['%s']"%"', '".join([t[0] for t in ar])
>>> print myformat
['u', 'u', ',,,u,,u,']

我认为这不是一种安全的方法,请建议另一种方法。非常感谢。 - KIRAN K J
我不认为这会引起问题。请给我一个失败的例子。 - Gryphius
我认为KIRAN的担忧是,通过手动构建列表的repr,你可能会创建一个不同的列表或损坏的列表。 - user610650
我认为他所说的“我需要以下所示的输出”只是指类似于列表repr的控制台输出格式,而不是创建新列表。你的答案似乎满足了这两种情况,我会投票支持你;-) - Gryphius

0

我只是添加了这一行,它就可以工作了

conn.text_factory = str

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接