当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从Python的sqlite3获取字段值列表,而不是表示行的元组》经验,为你挑选了4个好方法。

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

例如,当我执行

SELECT somecol FROM sometable

并打电话

cursor.fetchall()

它返回

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

但我宁愿得到

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

有没有办法做到这一点?



1> Darragh Enri..:

sqlite3.Connection有一个row_factory属性.

文件指出:

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

要从a返回单个值的列表SELECT,例如id,您可以指定一个lambda row_factory,返回每行中的第一个索引值; 例如:

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.


简单而且最好.我不知道为什么它不被接受作为答案!
谢谢:)我在问题首次发布(并解决)后很长一段时间回答了这个问题.至于接受与否 - 我很高兴它有所帮助!

2> unutbu..:
data=cursor.fetchall()
COLUMN = 0
column=[elt[COLUMN] for elt in data]

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



3> Nick Bastin..:

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

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


对于现代python,请参见下一个答案。

4> 小智..:

我使用模块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')

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有