web-dev-qa-db-fra.com

Comment créer un fichier CSV à partir d'une base de données en Python?

J'ai une table SQLite 3 et/ou MySQL nommée "clients" ..

À l'aide de python 2.6, comment créer un fichier csv nommé Clients100914.csv avec des en-têtes? Excel dialecte ...

Le Sql execute: select * ne donne que des données de table, mais je voudrais une table complète avec des en-têtes. 

Comment créer un jeu d'enregistrements pour obtenir les en-têtes de table. Les en-têtes de table doivent provenir 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 le fichier ouvert et aucun en-tête. Impossible également de comprendre comment utiliser le fichier comme journal. 

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) contient plus d'informations sur cursor.description.

51
Cristian Ciupitu

Utiliser le 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
Stephen Johnson

Vous pouvez facilement le créer manuellement en écrivant un fichier avec un séparateur choisi. Vous pouvez également utiliser module csv .

S'il s'agit d'une base de données, vous pouvez simplement utiliser une requête de votre client SQLite:

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

Ce qui va créer un fichier csv avec séparateur de tabulation.

5

Comment extraire les en-têtes de colonnes d'une table existante:

Vous n'avez pas besoin d'analyser une instruction SQL "create table". C'est une chance, car la syntaxe "create table" n'est ni Nice, ni clean, elle est warthog-moche.

Vous pouvez utiliser le table_info pragma. Il vous fournit des informations utiles sur chaque colonne d'un tableau, y compris le nom de la 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!
>>>

Autres problèmes liés à la réponse "parser la table SQL créée", maintenant supprimée:

  1. Stuff up avec par exemple create table test (id1 text, id2 int, msg text, primary key(id1, id2)) ... doit ignorer non seulement CONSTRAINT, mais également les mots clés PRIMARY, UNIQUE, CHECK et FOREIGN (voir le create table docs).

  2. Doit spécifier re.DOTALL au cas où il y aurait des retours à la ligne dans le SQL.

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

2
John Machin

Ceci est simple et fonctionne bien pour moi.

Disons que vous êtes déjà connecté à votre table de base de données et avez également un objet curseur. Alors à partir de là.

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

Vous semblez connaître Excel et vouloir en rester proche. Puis-je suggérer d'essayer PyExcelerator ?

0
inspectorG4dget

à moins que quelque chose me manque, vous voulez juste faire quelque chose comme ça ...

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

logique pour écrire des lignes dans un fichier (vous devrez peut-être organiser des valeurs et ajouter des comms ou des pipes, etc.)

f.close()
0
user39178