retrieving - Obtenga una lista de valores de campo de sqlite3 de Python, no tuplas que representan filas
sql python retrieving data (5)
Realmente no quieres hacer esto: cualquier cosa que hagas en la línea de usar zip o una lista de comprensión es solo comer ciclos de CPU y chupar la memoria sin agregar un valor significativo. Usted está mucho mejor servido solo para tratar con las tuplas.
En cuanto a por qué devuelve tuplas, es porque eso es lo que Python DBD API 2.0 requiere de fetchall
.
¡Es molesto cómo sqlite3
módulo sqlite3
de Python siempre devuelve una lista de tuplas! Cuando consulto una sola columna, preferiría obtener una lista simple.
por ejemplo, cuando ejecuto
SELECT somecol FROM sometable
y llama
cursor.fetchall()
vuelve
[(u''one'',), (u''two'',), (u''three'',)]
pero prefiero solo obtener
[u''one'', u''two'', u''three'']
¿Hay alguna forma de hacer esto?
Utilizo el módulo pandas para tratar el contenido de tabla:
df = pd.DataFrame(cursor.fetchall(), columns=[''one'',''two''])
La lista de valores para la columna ''uno'' se indica simplemente como:
df[''one''].values
Incluso puede usar su propio índice para la referencia de datos:
df0 = pd.DataFrame.from_records(cursor.fetchall(), columns=[''Time'',''Serie1'',''Serie2''],index=''Time'')
cuenta para el caso donde cursor.fetchall () devuelve una lista vacía:
try:
columnlist = list(zip(*cursor.fetchall())[COLUMN_INDEX])
except IndexError:
columnlist = []
sqlite3.Connection
tiene un atributo row_factory
.
La documentación establece que:
Puede cambiar este atributo por uno invocable que acepte el cursor y la fila original como una tupla y devolverá la fila del resultado real. De esta forma, puede implementar formas más avanzadas de devolver resultados, como devolver un objeto que también puede acceder a columnas por nombre.
Para devolver una lista de valores individuales de un SELECT
, como un id
, puede asignar un lambda a row_factory
que devuelve el primer valor indexado en cada fila; p.ej:
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()
Esto produce algo como:
[1, 2, 3, 4, 5, 6] # etc.
data=cursor.fetchall()
COLUMN = 0
column=[elt[COLUMN] for elt in data]
(Mi sugerencia anterior, column=zip(*data)[COLUMN]
, levanta un IndexError
si los data
son una tupla vacía. En contraste, la comprensión de la lista anterior simplemente crea una lista vacía. Dependiendo de su situación, puede ser preferible generar un IndexError
, pero te dejaré eso para que decidas).