令人讨厌的是Python的sqlite3
模块总是返回一个元组列表!当我查询单个列时,我宁愿得到一个简单的列表.
例如,当我执行
SELECT somecol FROM sometable
并打电话
cursor.fetchall()
它返回
[(u'one',), (u'two',), (u'three',)]
但我宁愿得到
[u'one', u'two', u'three']
有没有办法做到这一点?
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.
data=cursor.fetchall() COLUMN = 0 column=[elt[COLUMN] for elt in data]
(我之前的建议,column=zip(*data)[COLUMN]
提出一个IndexError
if data
是一个空元组.相反,上面的列表理解只会创建一个空列表.根据你的情况,提出一个IndexError
可能更好,但我会留给你决定.)
你真的不想这样做 - 你在使用zip或列表理解方面所做的任何事情都只是在占用CPU周期并吸收内存而不会增加重要价值.只需处理元组就可以了得更好.
至于为什么它返回的元组,这是因为这正是Python的DBD API 2.0的要求fetchall
.
我使用模块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')