Comment créer un fichier CSV à partir de la base de données en Python?
j'ai une table Sqlite 3 et/ou MySQL nommée "clients"..
en utilisant python 2.6, comment créer un fichier csv nommé Clients100914.csv avec les en-têtes? excel dialecte...
le Sql execute: select * donne seulement des données de table, mais je voudrais table complète avec des en-têtes.
Comment puis-je créer un enregistrement pour obtenir des en-têtes de table. Les en-têtes de table doivent venir directement de sql non écrit en python.
w = csv.writer(open(Fn,'wb'),dialect='excel')
#w.writelines("header_row")
#Fetch into sqld
w.writerows(sqld)
CE code me laisse avec un fichier ouvert et aucun en-tête. Aussi cant get comprendre comment utiliser le fichier comme log.
7 réponses
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) a plus d'informations sur cursor.description
.
module csv est très simple et fait pour cette tâche.
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'])
crée exactement le format que vous attendez.
Vous pouvez facilement le créer manuellement, en écrivant un fichier avec un séparateur choisi. Vous pouvez également utiliser module csv.
si c'est de la base de données, vous pouvez aussi utiliser une requête de votre client sqlite :
sqlite <db params> < queryfile.sql > output.csv
Qui va créer un fichier csv avec séparateur tab.
comment extraire les titres des colonnes d'une table existante:
vous n'avez pas besoin d'analyser une déclaration SQL "create table". c'est une chance, car la syntaxe "créer une table" n'est ni agréable ni propre, c'est warthog-ugly.
Vous pouvez utiliser le table_info
pragma. Il vous donne des informations utiles sur chaque colonne dans une table, y compris le nom du colonne.
Exemple:
>>> #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!
>>>
d'Autres problèmes avec le désormais supprimé "analyser le SQL create table" réponse:
affiche par exemple
create table test (id1 text, id2 int, msg text, primary key(id1, id2))
... doit ignorer non seulementCONSTRAINT
, mais aussi des mots-clésPRIMARY
,UNIQUE
,CHECK
etFOREIGN
(voircreate table
docs).doit spécifier
re.DOTALL
dans le cas où il ya des nouvelles lignes dans le SQL.line.split()[0].strip()
strip
est redondante.
C'est simple et fonctionne très bien pour moi.
disons que vous avez déjà connecté à votre table de base de données et que vous avez aussi un objet curseur. Donc suite à partir de ce point.
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)
à moins que je ne manque quelque chose, vous voulez juste faire quelque chose comme ça...
f = open("somefile.csv")
f.writelines("header_row")
logique pour écrire des lignes au fichier (vous pouvez avoir besoin d'organiser des valeurs et d'ajouter des comms ou des pipes etc...)
f.close()
Vous semblez être familier avec excel et que vous souhaitez rester près d'elle. Pourrais-je vous suggérer d'essayer PyExcelerator?