¿Cómo creo un archivo CSV desde la base de datos en Python?

Tengo una tabla Sqlite 3 y / o MySQL llamada “clientes” ..

Usando python 2.6, ¿Cómo creo un archivo csv llamado Clients100914.csv con encabezados? dialecto de excel …

Sql execute: select * solo proporciona datos de tabla, pero me gustaría completar la tabla con encabezados.

¿Cómo creo un conjunto de registros para obtener encabezados de tabla? Los encabezados de las tablas deben provenir directamente de sql no escritos en python.

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

Este código me deja con el archivo abierto y sin encabezados. También no puedo averiguar cómo utilizar el archivo como registro.

 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) tiene más información sobre cursor.description .

El uso del módulo csv es muy sencillo y está hecho para esta tarea.

 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']) 

Crea exactamente el formato que estás esperando.

Puede crearlo fácilmente manualmente, escribiendo un archivo con un separador elegido. También puede utilizar el módulo csv .

Si es de la base de datos, también puede utilizar una consulta de su cliente de sqlite:

 sqlite  < queryfile.sql > output.csv 

Lo que creará un archivo csv con separador de tabs.

Cómo extraer los encabezados de columna de una tabla existente:

No es necesario analizar una statement SQL “crear tabla”. Esto es afortunado, ya que la syntax de “crear tabla” no es ni agradable ni limpia, sino que es una lucha antiquísima.

Puede utilizar el pragma table_info . Le proporciona información útil sobre cada columna de una tabla, incluido el nombre de la columna.

Ejemplo:

 >>> #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! >>> 

Otros problemas con la respuesta ahora eliminada “analizar la tabla crear SQL”:

  1. Rellena con, por ejemplo, create table test (id1 text, id2 int, msg text, primary key(id1, id2)) … no solo se debe ignorar CONSTRAINT , sino también las palabras clave PRIMARY , UNIQUE , CHECK y FOREIGN (ver la create table docs).

  2. Necesita especificar re.DOTALL en caso de que haya nuevas líneas en el SQL.

  3. En line.split()[0].strip() la strip es redundante.

Esto es simple y funciona bien para mí.

Digamos que ya se ha conectado a la tabla de su base de datos y también tiene un objeto de cursor. Así que siguiendo a partir de ese punto.

 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) 

a menos que me esté perdiendo algo, solo quieres hacer algo así …

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

lógica para escribir líneas en el archivo (es posible que necesite organizar valores y agregar comunicaciones o canalizaciones, etc.)

 f.close() 

Pareces estar familiarizado con Excel y quieres estar cerca de él. ¿Puedo sugerir probar PyExcelerator ?