web-dev-qa-db-fra.com

Utilisation de python pour écrire une requête mysql sur csv, nécessité d'afficher les noms de champs

J'ai le suivant:

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)

Ceci produit un désordre déformé. Je connais bien l’utilisation du dossier d’impression [0], etc. pour produire quelque chose comme une requête dans une console. Je ne peux pas faire un simple INTO OUTFILE à partir du serveur mysql.

23
Mathnode

result est une liste de lignes. Vous devrez donc parcourir cette liste et écrire chaque ligne:

for row in result:
    c.writerow(row)
16
Daniel Roseman

Vous pouvez transférer tous les résultats dans le fichier csv sans effectuer de boucle:

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

Répondez avec les noms d'en-tête de colonne pour tous ceux qui rencontrent ceci:

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()
3
Mwspencer

La réponse précédente donnerait une erreur. L'en-tête doit d'abord être écrit dans le fichier, puis les lignes ajoutées. Ce qui suit a fonctionné pour moi. 

rows = cursor.fetchall()
headers = [col[0] for col in cursor.description] # get headers
rows = (Tuple(headers),) + rows # add headers to rows
fp = open('/tmp/file.csv', 'w')
myFile = csv.writer(fp)
myFile.writerow(headers)
myFile.writerows(rows)
fp.close()
3
George B

Ajoutez simplement une dernière chose à la réponse.

Si vous avez l'intention d'ouvrir ce fichier csv dans Windows, vous devez gérer les lignes vides supplémentaires.

remplacez simplement le code par le suivant, car le lineterminator par défaut de 2.7 est\r\n

myFile = csv.writer(fp, lineterminator='\n')
1
HappyBambi

Je connais un peu le python, mais après un peu de recherche sur Google, devriez-vous utiliser writerows (avec un S) qui écrit plusieurs lignes, plutôt que writerow qui attend une seule ligne.

Comme je le dis, c’est un coup de couteau dans le noir de ma part.

1
Jaydee
import pymysql
import sys
import csv

connection = pymysql.connect(Host='abcde',
user='admin',
password='secret',
db='databaseName',
port=12345)

dbQuery="SELECT field1, field2, fieldn FROM database.table;"
cur=connection.cursor()
cur.execute(dbQuery)
rows=cur.fetchall()
column_names = [i[0] for i in cur.description]
fp = open('DimDevice.csv', 'w')
myFile = csv.writer(fp, lineterminator = '\n')
myFile.writerow(column_names)   
myFile.writerows(rows)
fp.close()
0
MAES