2017-07-20 148 views
0

我有以下腳本用於i)連接到數據庫,ii)運行查詢,iii)將查詢結果保存爲csv,iv)通過電子郵件將輸出。使用pymssql寫入CSV並使用列名作爲標題

這一切工作正常,除了我似乎無法獲得列名作爲文件頭。我已經瀏覽過,但無法找到適合我的解決方案。我的腳本如下。任何幫助將是巨大的:

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) 

回答

2

按照DB-API - 到PyMSSQL complies - 有一個叫.description光標屬性,你可以在這裏使用。

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

這工作非常出色 - 非常感謝您的幫助。 –

+0

非常歡迎! – bernie

+0

你也可以'writer.writerows(cursor)'而不是'for'循環。 – Davos

0

cursor對象和環路上使用.description通過它來獲取列的名字,如:

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

    colNames = ','.join(colNameList) 
    print colNames 
相關問題