2017-07-20 31 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 
相关问题