2017-07-20 1 views
0

J'ai le script ci-dessous pour i) se connecter à une base de données, ii) lancer une requête, iii) sauvegarder les résultats de la requête en csv et iv) envoyer le sortie.Utiliser pymssql pour écrire en CSV et utiliser les noms de colonnes comme en-têtes

Tout fonctionne très bien, sauf que je n'arrive pas à obtenir les noms de colonnes comme en-têtes sur le fichier. J'ai parcouru SO, mais je ne trouve pas de solution qui fonctionne pour moi. Mon script est le suivant. Toute aide serait grande:

import pymssql 
import csv 
import smtplib 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
from email import encoders 
fromaddr='[email protected]' 
toaddr='[email protected]' 
msg = MIMEMultipart() 
msg['From'] = fromaddr 
msg['To'] = toaddr 
msg['Subject'] = "This is a test" 
body = "This is still a test" 
conn = pymssql.connect(server='XXXXXXXXXX.net', 
       port=XXXX, 
       user='XXXX', 
       password='XXXX', 
       database='XXXX') 
cursor = conn.cursor() 
query = 'Select * From Table' 
cursor.execute(query) 
with open("XXXXXXXX.csv","w") as outfile: 
    writer = csv.writer(outfile, quoting=csv.QUOTE_NONNUMERIC) 
    for row in cursor: 
     writer.writerow(row) 
msg.attach(MIMEText(body,'plain')) 
filename = "XXXXXX.csv" 
attachment = open("XXXXXXXXXXX.csv","rb") 
from email.mime.base import MIMEBase 
part = MIMEBase('application','octet-stream') 
part.set_payload((attachment).read()) 
encoders.encode_base64(part) 
part.add_header('Content-Disposition',"attachment; filename= %s" % filename) 
msg.attach(part) 
text = msg.as_string() 
server = smtplib.SMTP('smtp.office365.com',587) 
server.starttls() 
server.login(fromaddr,"XXXXXX") 
text = msg.as_string() 
server.sendmail(fromaddr,toaddr,text) 

Répondre

2

Selon le DB-API - auquel PyMSSQL complies - il est un attribut de curseur appelé .description que vous pouvez utiliser ici.

with open("XXXXXXXX.csv","w") as outfile: 
    writer = csv.writer(outfile, quoting=csv.QUOTE_NONNUMERIC) 
    writer.writerow(col[0] for col in cursor.description) 
    for row in cursor: 
     writer.writerow(row) 
+1

Cela a fonctionné très bien - merci beaucoup pour votre aide. –

+0

Vous êtes les bienvenus! – bernie

+0

vous pouvez aussi 'writer.writerows (cursor)' à la place de la boucle 'for'. – Davos

0

Utilisez le .description sur l'objet et la boucle cursor à travers elle pour obtenir les noms de la colonne comme:

colNameList = [] 
for i in range(len(cursor.description)): 
    desc = cursor.description[i] 
    colNameList.append(desc[0]) 

    colNames = ','.join(colNameList) 
    print colNames