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.
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
.
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.
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.
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:
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).
Doit spécifier re.DOTALL
au cas où il y aurait des retours à la ligne dans le SQL.
Dans line.split()[0].strip()
la strip
est redondante.
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)
Vous semblez connaître Excel et vouloir en rester proche. Puis-je suggérer d'essayer PyExcelerator ?
à 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()