如何过滤出sqlite输出

时间:2019-02-18 14:45:54

标签: python python-3.x sqlite output

有我的密码

conn = sqlite3.connect('someDB.db')
c = conn.cursor()
c.execute("SELECT column FROM someDB")
result = c.fetchall()

如您所见,它连接到数据库,选择一列并将其获取到结果中 顺便说一下,其中有4行,第1和第4个为空 当我打印结果时,它给了我

[(None,), ('useful',), ('useful',), (None,)]

为什么每个元素前后都有方括号;也是括号元素;我如何摆脱它们而只留下“无”和“有用”

所需的输出是

[None, 'useful', 'useful', None]

3 个答案:

答案 0 :(得分:0)

如果您始终需要获取列表中每个元组(单个元素)的第一个元素,则采用“通用”方式:

inputs = [(None,), ('useful',), ('useful',), (None,)]
outputs = []
for tuples in inputs:
  outputs.append(tuples[0])

如果您想要更多的Python语言,则可以使用python的list comprehension

outputs = [tuples[0] for tuples in inputs]

您还可以使用"spread" operator来使用变体:

outputs = [first_element for (first_element, *other_elements) in inputs]

最后,也许是最好的方法(我能想到):

outputs = [first_element for (first_element, ) in inputs]

答案 1 :(得分:0)

您也可以使用itertools

from itertools import chain

list(chain.from_iterable(result))

[None, 'useful', 'useful', None]

按原样返回结果的原因是因为Cursor对象返回了Row对象。当您从数据库中选择多于1列时,这显然更为明显/有用。

答案 2 :(得分:0)

如果数据库可能很大,那么首先构建一个1元组列表以将其转换为值列表可能不是最佳选择。 sqlite3的Python文档宣传使用fetchmany及其默认值来获得最佳性能。

可以通过以下方式构建最终列表:

result = []
while True:
    chunk = c.fetchmany()
    if len(chunk) == 0: break
    result.extend([row[0] for row in chunk])

或者,如果您希望通过生成器一次完整地构建列表:

def chunks(cursor):
    while True:
        chunk = c.fetchmany()
        if len(chunk) == 0: return
        yield chunk

...
result = [row[0] for chunk in chunks(c) for row in chunk]