2011-01-06 8 views
19

Tengo el siguiente:usando Python para escribir consulta MySQL a csv, tienen que mostrar nombres de campo

import MySQLdb as dbapi 
import sys 
import csv 

dbServer='localhost' 
dbPass='supersecretpassword' 
dbSchema='dbTest' 
dbUser='root' 

dbQuery='SELECT * FROM pbTest.Orders;' 

db=dbapi.connect(host=dbServer,user=dbUser,passwd=dbPass) 
cur=db.cursor() 
cur.execute(dbQuery) 
result=cur.fetchall() 

c = csv.writer(open("temp.csv","wb")) 
c.writerow(result) 

Ésta es ilegible produce un desastre. Estoy familiarizado con el uso de la impresión de registro [0], etc. No estoy seguro de cómo debo comenzar a configurar el formateo. para producir algo así como lo haría una consulta en una consola. No puedo hacer un INTO OUTFILE simple desde el servidor mysql.

Respuesta

15

result es una lista de filas. Por lo que usted necesita para recorrer la lista y escribir cada fila:

for row in result: 
    c.writerow(row) 
+0

eso es genial, ¿alguna idea de cómo puedo escribir los nombres de campo también? – Mathnode

+4

@teatime - Puede obtener los nombres de campo de 'result [0] .keys' (o equivalentemente' row.keys'. – mtrw

+1

Desafortunadamente, esta respuesta no responde completamente el título de la pregunta ("necesidad de mostrar los nombres de los campos"). El comentario de @ mtrw ayuda, pero no es aplicable al código dado (el objeto tuple no tiene atributos 'claves'). Podría ser aplicable si el cursor fuera un cursor de diccionario, es decir, creado usando 'dbconn.cursor (dictionary = True)'. – LarsH

1

Sé poco de python, pero después de un poco de googleo, debería estar usando writerows (con una S) que escribe varias filas, en lugar de writerow que espera una sola fila.

Como digo, esta es una puñalada en la oscuridad de mi parte.

23

se puede volcar todos los resultados en el archivo csv sin bucle:

rows = cursor.fetchall() 
fp = open('/tmp/file.csv', 'w') 
myFile = csv.writer(fp) 
myFile.writerows(rows) 
fp.close() 
+1

Gran respuesta. Simplemente cambiaría la variable 'archivo' a algo así como myfile ya que 'archivo' es una palabra clave. – Will

+1

Este trabajo Es genial, pero de todos modos podría obtener los nombres de campo/columnas también, por favor. –

+0

Gracias, encontré esto muy útil. –

1

Sólo tiene que añadir una cosa más que @jwhat respuesta .

Si tiene la intención de abrir este archivo csv en Windows, tendrá que manejar las líneas adicionales vacías.

acaba de cambiar el código a la siguiente, según el lineterminator defecto en 2.7 es \ r \ n

myFile = csv.writer(fp, lineterminator='\n') 
+0

¡Gracias! He estado abierto y eliminado las líneas en blanco a partir de ahí, y siempre fue un dolor, y nunca me imaginé para detenerlo. – Mwspencer

0

respuesta con los nombres de encabezado de columna para cualquier persona que se encuentra con esto: (estoy usando el método de Jwhat a escribir a csv)

result = cur.fetchall() 

#Getting Field Header names 
column_names = [i[0] for i in cur.description] 
fp = open('Result_Set.csv' 'w') 
myFile = csv.writer(fp, lineterminator = '\n') #use lineterminator for windows 
myFile.writerow(column_names) 
myFile.writerows(result) 
fp.close() 
Cuestiones relacionadas