it-swarm.com.de

Wie erstelle ich eine CSV-Datei aus einer Datenbank in Python?

Ich habe eine Sqlite 3- und/oder MySQL-Tabelle mit dem Namen "clients".

Wie erstelle ich mit cython 2.6 eine csv-Datei mit dem Namen Clients100914.csv mit Kopfzeilen? Excel-Dialekt ...

Die SQL-Anweisung ausführen: select * gibt nur Tabellendaten an, aber ich möchte eine vollständige Tabelle mit Kopfzeilen. 

Wie erstelle ich einen Datensatz, um Tabellenköpfe zu erhalten? Die Tabellenüberschriften sollten direkt aus SQL stammen und nicht in Python geschrieben sein. 

w = csv.writer(open(Fn,'wb'),dialect='Excel')
#w.writelines("header_row")
#Fetch into sqld
w.writerows(sqld)

Dieser Code lässt mich mit der Datei offen und keine Header. Man kann auch nicht herausfinden, wie man eine Datei als Protokoll verwendet. 

23
Merlin
import csv
import sqlite3

from glob import glob; from os.path import expanduser
conn = sqlite3.connect( # open "places.sqlite" from one of the Firefox profiles
    glob(expanduser('~/.mozilla/firefox/*/places.sqlite'))[0]
)
cursor = conn.cursor()
cursor.execute("select * from moz_places;")
#with open("out.csv", "w", newline='') as csv_file:  # Python 3 version    
with open("out.csv", "wb") as csv_file:              # Python 2 version
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow([i[0] for i in cursor.description]) # write headers
    csv_writer.writerows(cursor)

PEP 249 (DB API 2.0) enthält weitere Informationen zu cursor.description.

51

Die Verwendung des Moduls csv ist für diese Aufgabe sehr einfach.

import csv
writer = csv.writer(open("out.csv", 'w'))
writer.writerow(['name', 'address', 'phone', 'etc'])
writer.writerow(['bob', '2 main st', '703', 'yada'])
writer.writerow(['mary', '3 main st', '704', 'yada'])

Erzeugt genau das Format, das Sie erwarten.

8
Stephen Johnson

Sie können es einfach manuell erstellen, indem Sie eine Datei mit einem ausgewählten Trennzeichen schreiben. Sie können auch csv module verwenden.

Wenn es sich um eine Datenbank handelt, können Sie auch eine Abfrage von Ihrem SQLite-Client verwenden:

sqlite <db params> < queryfile.sql > output.csv

Dadurch wird eine CSV-Datei mit Tabulator-Trennzeichen erstellt.

So extrahieren Sie die Spaltenüberschriften aus einer vorhandenen Tabelle:

Sie brauchen keine SQL-Anweisung "create table" zu parsen. Dies ist ein Glück, da die Syntax "create table" weder "Nice" noch "Clean" ist, sondern warthog-ugly.

Sie können das Pragma table_info verwenden. Sie erhalten nützliche Informationen zu jeder Spalte in einer Tabelle, einschließlich des Namens der Spalte.

Beispiel:

>>> #coding: ascii
... import sqlite3
>>>
>>> def get_col_names(cursor, table_name):
...     results = cursor.execute("PRAGMA table_info(%s);" % table_name)
...     return [row[1] for row in results]
...
>>> def wrong_way(cur, table):
...     import re
...     cur.execute("SELECT sql FROM sqlite_master WHERE name=?;", (table, ))
...     sql = cur.fetchone()[0]
...     column_defs = re.findall("[(](.*)[)]", sql)[0]
...     first_words = (line.split()[0].strip() for line in column_defs.split(','))
...     columns = [Word for Word in first_words if Word.upper() != "CONSTRAINT"]
...     return columns
...
>>> conn = sqlite3.connect(":memory:")
>>> curs = conn.cursor()
>>> _ignored = curs.execute(
...     "create table foo (id integer, name text, [haha gotcha] text);"
...     )
>>> print get_col_names(curs, "foo")
[u'id', u'name', u'haha gotcha']
>>> print wrong_way(curs, "foo")
[u'id', u'name', u'[haha'] <<<<<===== WHOOPS!
>>>

Andere Probleme mit der jetzt gelöschten Antwort "Pare the create table SQL":

  1. Stopft mit z. create table test (id1 text, id2 int, msg text, primary key(id1, id2)) ... muss nicht nur CONSTRAINT ignorieren, sondern auch die Schlüsselwörter PRIMARY, UNIQUE, CHECK und FOREIGN (siehe create table docs).

  2. Muss re.DOTALL angeben, falls in der SQL Zeilenumbrüche vorhanden sind.

  3. In line.split()[0].strip() ist die strip redundant.

2
John Machin

Das ist einfach und funktioniert gut für mich.

Angenommen, Sie haben bereits eine Verbindung zu Ihrer Datenbanktabelle hergestellt und haben auch ein Cursorobjekt erhalten. Also von diesem Punkt an weiter.

import csv
curs = conn.cursor()
curs.execute("select * from oders")
m_dict = list(curs.fetchall())

with open("mycsvfile.csv", "wb") as f:
    w = csv.DictWriter(f, m_dict[0].keys())
    w.writerow(dict((fn,fn) for fn in m_dict[0].keys()))
    w.writerows(m_dict)
1
Francis Kessie

Sie scheinen mit Excel vertraut zu sein und möchten nahe daran bleiben. Darf ich vorschlagen, PyExcelerator auszuprobieren?

0
inspectorG4dget

wenn ich etwas verpasse, willst du einfach so etwas tun ...

f = open("somefile.csv")
f.writelines("header_row")

logik zum Schreiben von Zeilen in eine Datei (möglicherweise müssen Sie Werte organisieren und Komms oder Pipes hinzufügen usw.).

f.close()
0
user39178