Holen Sie sich eine Liste von Feldwerten aus Python's sqlite3, nicht Tupel, die Zeilen darstellen

Es ist nervig, wie Pythons sqlite3 Modul immer eine Liste von Tupeln zurückgibt! Wenn ich eine einzelne Spalte abfrage, würde ich lieber eine einfache Liste bekommen.

ZB wenn ich ausführen

 SELECT somecol FROM sometable 

Und ruf an

 cursor.fetchall() 

Es kommt zurück

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

Aber ich würde lieber nur bekommen

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

Gibt es einen Weg, dies zu tun?

  • Grafische sqlite3-Daten mit reportlab
  • Warum mein Python sieht nicht pysqlite?
  • Bulk Insert riesige Daten in SQLite mit Python
  • Python sqlite3 String Variable in execute
  • Wie erstelle ich eine SELECT-Anweisung mit einer Liste als Parameter?
  • "Kann die SpatiaLite-Bibliothek nicht finden." Django
  • Python SQL-Funktion, Abfrage, um Daten nach Minuten zu gruppieren
  • Python insert numpy array in sqlite3 Datenbank
  • 5 Solutions collect form web for “Holen Sie sich eine Liste von Feldwerten aus Python's sqlite3, nicht Tupel, die Zeilen darstellen”

    Sie wollen das nicht wirklich tun – alles, was Sie tun, entlang der Linien der Verwendung von Zip oder ein Listen-Verständnis ist nur essen CPU-Zyklen und saugen Speicher ohne signifikanten Wert. Du bist viel besser gedient, nur mit den Tupeln umzugehen.

    Wieso gibt es Tupel, es ist, weil das ist, was die Python DBD API 2.0 von fetchall benötigt.

    sqlite3.Connection hat ein row_factory Attribut.

    In der Dokumentation heißt es:

    Sie können dieses Attribut auf einen Aufruf ändern, der den Cursor und die ursprüngliche Zeile als Tupel akzeptiert und die reale Ergebniszeile zurückgibt. Auf diese Weise können Sie erweiterte Möglichkeiten zur Rückgabe von Ergebnissen implementieren, z. B. das Zurückgeben eines Objekts, das auch auf Spalten zugreifen kann.

    Um eine Liste von Einzelwerten aus einer SELECT , z. B. einer id , zurückzugeben, können Sie eine row_factory lambda zu row_factory zuweisen, die den ersten indizierten Wert in jeder Zeile zurückgibt. z.B:

     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() 

    Das ergibt so etwas wie:

     [1, 2, 3, 4, 5, 6] # etc. 
     data=cursor.fetchall() COLUMN = 0 column=[elt[COLUMN] for elt in data] 

    (Meine vorherige column=zip(*data)[COLUMN] , column=zip(*data)[COLUMN] , hebt einen IndexError wenn data ein leeres Tupel sind. Im Gegensatz dazu erstellt das Listenverständnis nur eine leere Liste. Je nach Situation kann die Erhöhung eines IndexError vorzuziehen sein , Aber ich werde das dir überlassen, um zu entscheiden.)

    Ich benutze die Modul- Pandas , um mit Tisch-ähnlichen Inhalt umzugehen:

     df = pd.DataFrame(cursor.fetchall(), columns=['one','two']) 

    Die Liste der Werte für Spalte 'Eins' wird einfach als:

     df['one'].values 

    Sie können sogar einen eigenen Index für die Datenreferenz verwenden:

     df0 = pd.DataFrame.from_records(cursor.fetchall(), columns=['Time','Serie1','Serie2'],index='Time') 

    Für den Fall, dass cursor.fetchall () eine leere Liste zurückgibt:

     try: columnlist = list(zip(*cursor.fetchall())[COLUMN_INDEX]) except IndexError: columnlist = [] 
    Python ist die beste Programmiersprache der Welt.