如何过滤掉sqlite输出

问题描述 投票:0回答:3

有我的代码

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

当你看到它连接到db时,选择一个列并通过其中有4行的方式将其提取到结果中,当我打印结果时,1st和4th为null它给了我这个

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

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

期望的输出是

[None, 'useful', 'useful', None]
python python-3.x sqlite output
3个回答
0
投票

你也可以使用itertools

from itertools import chain

list(chain.from_iterable(result))

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

你的结果以它们的方式返回的原因是因为Cursor对象返回Row对象。当您从数据库中选择多个列时,这显然更明显/有用。


0
投票

如果你总是需要获得列表中每个元组(单例)的第一个元素,那就是“通用”方式:

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

如果你想要更多pythonic的东西,那么你可以使用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]

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]
© www.soinside.com 2019 - 2024. All rights reserved.