2010-09-14 79 views
21

Tengo una tabla Sqlite 3 y/o MySQL llamada "clientes" ...¿Cómo creo un archivo CSV desde la base de datos en Python?

Usando Python 2.6, ¿Cómo creo un archivo csv llamado Clients100914.csv con encabezados? excel dialect ...

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

Cómo creo un conjunto de registros para obtener encabezados de tabla. Los encabezados de tabla deben venir directamente de sql no escrito 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. Tampoco puedo entender cómo usar el archivo como registro.

+0

¿Desea que el contenido de esa tabla se guarde en el archivo? – SilentGhost

+2

¿Qué hay de malo con el uso del módulo 'csv'? –

+0

Necesito todo el contenido de la tabla con la fecha. – Merlin

Respuesta

45
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 acerca de cursor.description.

+0

Ok, el código parece mucho más fácil de entender y mantener, lo mismo para MySql y Sybase, si la cadena de conexión chg? – Merlin

+2

para la fila en el cursor: csv_writer.writerow (fila) > csv_writer.writerows (fila) – Merlin

+0

@ user428862: el código también debería funcionar con bases de datos MySQL o Sybase. He actualizado la respuesta con tu sugerencia. –

4

Puede crearlo fácilmente manualmente, escribiendo un archivo con un separador elegido. También puede usar csv module.

Si se trata de la base de datos se puede alo sólo tiene que utilizar una consulta de su cliente SQLite:

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

que creará un archivo CSV con separador de pestaña.

+1

Por supuesto, el comando '.separator,' puede ser utilizado en los comandos para sqlite para hacer que el archivo csv use separadores de coma. –

+1

¿Se escapa separadores en los datos? –

0

menos que me falta algo, lo que desea hacer algo así ...

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

lógica para escribir las líneas al archivo (puede que necesite para organizar los valores y añadir comunicaciones o tuberías, etc .. .)

f.close() 
+0

aunque la respuesta de Guillaume es más directa. –

+0

necesito el módulo pyodbc, entonces puedo usar mysql más tarde. – Merlin

8

utilizando los csv module es muy sencillo y se dirigió a 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.

+0

gracias, hacer Necesito definir cada fila. Creo Debería crear un archivo con fecha, crear una fila de encabezados, seleccionar *, luego insertar Seleccionar * en csv. – Merlin

+2

No escribe los encabezados de la tabla programáticamente. – Merlin

2

Cómo extraer los títulos de las columnas de una tabla existente:

No es necesario analizar una SQL "CREATE TABLE" declaración. Esto es una suerte, ya que la sintaxis de "crear tabla" no es agradable ni está limpia, es warthog-feo.

Puede usar el pragma table_info. Le brinda información útil sobre cada columna en 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 el ahora suprimido- "analizar el crear SQL tabla" respuesta:

  1. Stuffs arriba con, por ejemplo create table test (id1 text, id2 int, msg text, primary key(id1, id2)) ... necesita ignorar no solo CONSTRAINT, sino también las palabras clave PRIMARY, UNIQUE, CHECK y FOREIGN (consulte los documentos create table).

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

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

+0

gracias, john .... en el siguiente código tuve que agregar solo dos líneas al código existente ... ¡Vaya Python! – Merlin

0

Parece que está familiarizado con Excel y desea mantenerse cerca de él. ¿Puedo sugerir intentar PyExcelerator?

+5

¿Eres tú, Clippy?^_- –

+0

-1 pyExcelerator es abandware. Use xlwt (http://www.python-excel.org) en su lugar. Es una bifurcación de pyExcelerator con correcciones de errores y varias mejoras. [Dis] claimer: soy el mantenedor. –

+0

Sé que Excel/VBA, pero alejándome de MSFT y Windows. – Merlin

0

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. Entonces, continuando desde 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) 
Cuestiones relacionadas