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.

23
demandé sur Merlin 2010-09-14 19:15:12

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.

50
répondu Cristian Ciupitu 2016-10-26 16:28:08

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.

8
répondu Stephen Johnson 2010-09-14 15:30:04

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.

5
répondu Guillaume Lebourgeois 2010-09-14 15:19:11

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:

  1. affiche par exemple create table test (id1 text, id2 int, msg text, primary key(id1, id2)) ... doit ignorer non seulement CONSTRAINT, mais aussi des mots-clés PRIMARY,UNIQUE,CHECK et FOREIGN (voir create table docs).

  2. doit spécifier re.DOTALL dans le cas où il ya des nouvelles lignes dans le SQL.

  3. line.split()[0].strip()strip est redondante.

2
répondu John Machin 2015-10-05 20:14:50

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)
1
répondu Francis Kessie 2017-03-29 01:52:06

à 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()
0
répondu 2010-09-14 15:22:00

Vous semblez être familier avec excel et que vous souhaitez rester près d'elle. Pourrais-je vous suggérer d'essayer PyExcelerator?

0
répondu inspectorG4dget 2010-09-22 03:29:40