从Python的sqlite3获取字段值列表,而不是表示行的元组

时间:2010-05-18 01:11:18

标签: python sqlite

令人讨厌的是Python的sqlite3模块总是返回一个元组列表!当我查询单个列时,我宁愿得到一个简单的列表。

e.g。当我执行

SELECT somecol FROM sometable

并致电

cursor.fetchall()

它返回

[(u'one',), (u'two',), (u'three',)]

但我宁愿得到

[u'one', u'two', u'three']

有办法做到这一点吗?

8 个答案:

答案 0 :(得分:61)

sqlite3.Connection具有row_factory属性。

文件说明:

  

您可以将此属性更改为可接受游标和原始行作为元组的可调用对象,并返回实际结果行。这样,您可以实现更高级的返回结果的方法,例如返回一个也可以按名称访问列的对象。

要返回SELECT中单个值的列表,例如id,您可以将lambda指定给row_factory,它返回每行中的第一个索引值; e.g:

import sqlite3 as db

conn = db.connect('my.db')
conn.row_factory = lambda cursor, row: row[0]
c = conn.cursor()
ids = c.execute('SELECT id FROM users').fetchall()

这会产生类似的结果:

[1, 2, 3, 4, 5, 6] # etc.

答案 1 :(得分:14)

data=cursor.fetchall()
COLUMN = 0
column=[elt[COLUMN] for elt in data]

(我之前的建议column=zip(*data)[COLUMN],如果IndexError是一个空元组,则会引发data。相反,上面的列表理解只会创建一个空列表。根据您的情况,提出IndexError可能更好,但我会留给你决定。)

答案 2 :(得分:9)

你真的不想这样做 - 你在使用zip或列表理解方面所做的任何事情都只是在占用CPU周期并吸收内存而不会增加重要价值。只需要处理元组就可以了得更好。

至于为什么它会返回元组,因为这是Python DBD API 2.0fetchall的要求。

答案 3 :(得分:5)

我使用模块 pandas 来处理类似于表格的内容:

df = pd.DataFrame(cursor.fetchall(), columns=['one','two'])

列'one'的值列表简称为:

df['one'].values

您甚至可以使用自己的索引进行数据引用:

df0 = pd.DataFrame.from_records(cursor.fetchall(), columns=['Time','Serie1','Serie2'],index='Time')

答案 4 :(得分:0)

zlist = []

tupls = c.fetchall()

for tup in tupls:

    t = str(tup).replace("('","").replace("',)","")

    zlist.append(t)

现在,您不必处理元组,熊猫或以上任何无效的东西。

答案 5 :(得分:0)

我从以下内容开始,这给了我同样的元组列表:

video_ids = []

for row in c.execute('SELECT id FROM videos_metadata'):
        video_ids.append(row)

...以便解决它并获得列表,我希望我只是显式地取出返回的元组中的第一个元素...

video_ids = []

for row in c.execute('SELECT id FROM videos_metadata'):
        video_ids.append(row[0])

这似乎对我来说是个窍门(根据OP的问题),并且是一个非常简单的解决方案(也许是我从未想到过的 simplistic )。不知道它如何扩展,但运行得足够快,足以处理我拥有的5000多个条目,而又不会太在意(31毫秒),我们在这里谈论的是SQLite,因此大概不会处理成千上万的行。

答案 6 :(得分:0)

cursor.fetchall()返回[(u'one',), (u'two',), (u'three',)]

如果您想要[u'one', u'two', u'three'],请使用以下命令:

[x[0] for x in cursor.fetchall()]

答案 7 :(得分:-1)

说明cursor.fetchall()返回空列表的情况:

try:
    columnlist = list(zip(*cursor.fetchall())[COLUMN_INDEX])
except IndexError:
    columnlist = []