1. 程式人生 > >python連線oracel資料庫,提取資料後製圖並通過郵件傳送

python連線oracel資料庫,提取資料後製圖並通過郵件傳送

總體要求:

               通過python自動從oracle提取原始資料,對原始資料製圖,併發送郵件。發郵件時,通過oracle提取的資料儲存為excel作為附件傳送,圖片及相關文字內容通過郵件正文傳送。

====================================================================================================================================================================================================

我的電腦系統需要是 :W-amd64  
 
1、先安裝python-3.6.0
安裝的時候注意勾選 add to path

2、安裝orcael軟體

winx64_12102_data  總共兩部分,需要全部下載,然後兩個都要解壓,解壓的路徑要相同。
安裝的時候選擇桌面版

3、安裝vs_community
安裝的時候記得勾選tools for python。
安裝過程中會提示6ee7bbee8435130a869cf971694fd9e2.cab找不到。把6ee7bbee8435130a869cf971694fd9e2.cab下載下來,提示
報錯的時候選擇從本地匯入。

4、安裝各種模組

主要有numpy xlwt matplotlib cx_Oracle

安裝命令為:pip install xlwt     其它類似

除了cx_Oracle 其它的均可在cmd下 通過pip install 命令安裝
cx_Oracle  需要從本地安裝,下載cx_Oracle-5.2.1+oci12c-cp36-cp36m-win_amd64.whl到本地,通過pip install 路徑\cx_Oracle-5.2.1+oci12c-cp36-cp36m-win_amd64.whl進行安裝

雲盤連結: https://pan.baidu.com/s/1nvjZH2L 密碼: hn4y

====================================================================================================================================
====================================================================================================================================

程式碼,程式碼備註已經很詳細了,這裡不再贅述。

#!/usr/bin/python
#coding=utf-8



import sys
import cx_Oracle 
import datetime
import xlwt
import numpy as np  
import matplotlib.pyplot as plt

#郵件相關的庫
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication
from email.header import Header

#製圖相關的庫


#根據系統時間定義相關變數
ha=(datetime.datetime.now()-datetime.timedelta(days=7)).strftime("%Y%m%d")#把2017020200格式的時間賦值給ha,後邊sql中需要依據時間進行輸入
he=datetime.datetime.now().strftime("%Y-%m-%d")
ho=datetime.datetime.now().strftime('%m-%d-%H')

#連線資料庫配置ip 使用者名稱 密碼
conn = cx_Oracle.connect('gzhxx/[email protected]/oss')    
cursor = conn.cursor ()
printHeader = True
#定義sql語句
sql = "select city 城市,substr(RiQi,5,8) 日期,XiaoShi 小時,Total_GB 總流量,RRC_Setup_Succ_Rate RRC連線建立成功率,Erab_Setup_Succ_Rate ERAB建立成功率,S1_Setup_Succ_Rate 信令建立成功率,Radio_Setup_Succ_Rate 無線接通率,HO_Succ_Rate_Prep 切換成功率 ,Cell_Availabilty 小區可用率 FROM omc.kpi2 where city <> 'HKGaoSsu' and  ShiDuan = 'Whole_Day' and (QuXian = 'GZ_WholeNetwork' or QuXian = 'CityLevel') and ShiJian >=%s order by city,substr(RiQi,5,8)" % (ha)

cursor.execute (sql)#執行sql語句
rows = cursor.fetchall()#讀取sql結果
count=len(rows)


f = xlwt.Workbook() #建立工作簿
sheet1 = f.add_sheet(u'sheet1',cell_overwrite_ok=True) #建立sheet


i=0#定義從第一行開始存資料,0代表第一行
     

#定義表頭格式	 
biaotou = ['區域','日期','小時','總流量','RRC連線建立成功率','ERAB建立成功率','S1信令建立成功率','無線接通率','切換成功率','小區可用率']
k=0
for k in range(10):
    sheet1.write(0,k,biaotou[k])
    k+1


	
#f.save('%s.xls' % (he))#儲存檔案,這裡就用了上文生成的時間變數作為檔名
    
    
    
i=0
#把sql取的資料存到excel中
for i in range(len(rows)):
    p=i+1
    k=0#每進行一次for迴圈就重置一次k值,確保資料寫入時(如果這列有資料的話)總是從第一列開始
    if type(rows[i])==tuple:#表格的第一列開始寫資料,第一列,第二例。。。。(如果改行只有一個單元格的資料,將不會觸發該動作)
        for k in range(len(rows[i])):
            sheet1.write(p,k,rows[i][k])
            k+1
        
    else:
        sheet1.write(p,k,rows[i])#表格的第一行開始寫。第一行,第二行。。。。
        i+1
		
f.save('D:\kpi\%s.xls' % (he))#儲存檔案,這裡就用了上文生成的時間變數作為檔名


#臨時引數
qriqi = []
qliuliang = []
qrrc = []
qerab = []
qs1 =[]
qwuxian = []
qqiehuan = []
qkeyong = []

triqi = []
tliuliang = []
trrc = []
terab = []
ts1 =[]
twuxian = []
tqiehuan = []
tkeyong = []

griqi = []
gliuliang = []
grrc = []
gerab = []
gs1 =[]
gwuxian = []
gqiehuan = []
gkeyong = []

sriqi = []
sliuliang = []
srrc = []
serab = []
ss1 =[]
swuxian = []
sqiehuan = []
skeyong = []

#讀取資料到對應格式
s=0
for s in range(len(rows)):
    if rows[s][0]=='GZQDN                    ':
        qriqi.append(rows[s][1])
        qliuliang.append(rows[s][3])
        qrrc.append(rows[s][4])
        qerab.append(rows[s][5])
        qs1.append(rows[s][6])
        qwuxian.append(rows[s][7])
        qqiehuan.append(rows[s][8])
        qkeyong.append(rows[s][9])
    elif rows[s][0]=='GZTR                     ':
        triqi.append(rows[s][1])
        tliuliang.append(rows[s][3])
        trrc.append(rows[s][4])
        terab.append(rows[s][5])
        ts1.append(rows[s][6])
        twuxian.append(rows[s][7])
        tqiehuan.append(rows[s][8])
        tkeyong.append(rows[s][9])        
    elif rows[s][0]=='GZ_WholeNetwork          ': 
        griqi.append(rows[s][1])
        gliuliang.append(rows[s][3])
        grrc.append(rows[s][4])
        gerab.append(rows[s][5])
        gs1.append(rows[s][6])
        gwuxian.append(rows[s][7])
        gqiehuan.append(rows[s][8])
        gkeyong.append(rows[s][9])	
    elif rows[s][0]=='SmallCell                ':
        sriqi.append(rows[s][1])
        sliuliang.append(rows[s][3])
        srrc.append(rows[s][4])
        serab.append(rows[s][5])
        ss1.append(rows[s][6])
        swuxian.append(rows[s][7])
        sqiehuan.append(rows[s][8])
        skeyong.append(rows[s][9])
    else:
        s+1
	
	

	
#製圖







 



#流量
 
xData = qriqi      
yData1 = qliuliang
yData2 = tliuliang
yData3 = sliuliang
yData4 = gliuliang
#plt.ylim(ymin = 97.00,ymax = 100) 
plt.figure(num=1, figsize=(6, 4))  
plt.title('7days-throughput', size=20)  
plt.xlabel('Date', size=14)  
plt.ylabel('Gb', size=14)
#plt.ylabel('y-axis', size=14)  
plt.plot(xData, yData1, color='b', linestyle='-', marker='o', label='QDN')  
plt.plot(xData, yData2, color='r', linestyle='-', marker='o', label='TR')
plt.plot(xData, yData3, color='g', linestyle='-', marker='o', label='Smallcell')
plt.plot(xData, yData4, color='y', linestyle='-', marker='o', label='Whole_network')  
plt.legend(loc='lower right')  
plt.savefig('D:\\kpi\\1.png', format='png')

#RRC
xData = qriqi      
yData1 = qrrc
yData2 = trrc
yData3 = srrc
yData4 = grrc
#plt.ylim(ymin = 97.00,ymax = 100) 
plt.figure(num=2, figsize=(6, 4))  
plt.title('7days-RRC_Setup_Succ_Rate', size=20)  
plt.xlabel('Date', size=14)  
plt.ylabel('percentage', size=14)
#plt.ylabel('y-axis', size=14)  
plt.plot(xData, yData1, color='b', linestyle='-', marker='o', label='QDN')  
plt.plot(xData, yData2, color='r', linestyle='-', marker='o', label='TR')
plt.plot(xData, yData3, color='g', linestyle='-', marker='o', label='Smallcell')
plt.plot(xData, yData4, color='y', linestyle='-', marker='o', label='Whole_network')  
plt.legend(loc='lower right')  
plt.savefig('D:\\kpi\\2.png', format='png')



#ERAB建立成功率
xData = qriqi      
yData1 = qerab
yData2 = terab
yData3 = serab
yData4 = gerab
#plt.ylim(ymin = 97.00,ymax = 100) 
plt.figure(num=3, figsize=(6, 4))  
plt.title('7days-Erab_Setup_Succ_Rate', size=20)  
plt.xlabel('Date', size=14)  
plt.ylabel('percentage', size=14)
#plt.ylabel('y-axis', size=14)  
plt.plot(xData, yData1, color='b', linestyle='-', marker='o', label='QDN')  
plt.plot(xData, yData2, color='r', linestyle='-', marker='o', label='TR')
plt.plot(xData, yData3, color='g', linestyle='-', marker='o', label='Smallcell')
plt.plot(xData, yData4, color='y', linestyle='-', marker='o', label='Whole_network')  
plt.legend(loc='lower right')  
plt.savefig('D:\\kpi\\3.png', format='png')

#S1信令建立成功率
xData = qriqi      
yData1 = qs1
yData2 = ts1
yData3 = ss1
yData4 = gs1
#plt.ylim(ymin = 97.00,ymax = 100) 
plt.figure(num=4, figsize=(6, 4))  
plt.title('7days-S1_Setup_Succ_Rate', size=20)  
plt.xlabel('Date', size=14)  
plt.ylabel('percentage', size=14)
#plt.ylabel('y-axis', size=14)  
plt.plot(xData, yData1, color='b', linestyle='-', marker='o', label='QDN')  
plt.plot(xData, yData2, color='r', linestyle='-', marker='o', label='TR')
plt.plot(xData, yData3, color='g', linestyle='-', marker='o', label='Smallcell')
plt.plot(xData, yData4, color='y', linestyle='-', marker='o', label='Whole_network')  
plt.legend(loc='lower right')  
plt.savefig('D:\\kpi\\4.png', format='png')

#無線接通率
xData = qriqi      
yData1 = qwuxian
yData2 = twuxian
yData3 = swuxian
yData4 = gwuxian
#plt.ylim(ymin = 97.00,ymax = 100) 
plt.figure(num=5, figsize=(6, 4))  
plt.title('7days-Radio_Setup_Succ_Rate', size=20)  
plt.xlabel('Date', size=14)  
plt.ylabel('percentage', size=14)
#plt.ylabel('y-axis', size=14)  
plt.plot(xData, yData1, color='b', linestyle='-', marker='o', label='QDN')  
plt.plot(xData, yData2, color='r', linestyle='-', marker='o', label='TR')
plt.plot(xData, yData3, color='g', linestyle='-', marker='o', label='Smallcell')
plt.plot(xData, yData4, color='y', linestyle='-', marker='o', label='Whole_network')  
plt.legend(loc='lower right')  
plt.savefig('D:\\kpi\\5.png', format='png')


#切換成功率
xData = qriqi      
yData1 = qqiehuan
yData2 = tqiehuan
yData3 = sqiehuan
yData4 = gqiehuan
#plt.ylim(ymin = 97.00,ymax = 100) 
plt.figure(num=6, figsize=(6, 4))  
plt.title('7days-HO_Succ_Rate_Prep', size=20)  
plt.xlabel('Date', size=14)  
plt.ylabel('percentage', size=14)
#plt.ylabel('y-axis', size=14)  
plt.plot(xData, yData1, color='b', linestyle='-', marker='o', label='QDN')  
plt.plot(xData, yData2, color='r', linestyle='-', marker='o', label='TR')
plt.plot(xData, yData3, color='g', linestyle='-', marker='o', label='Smallcell')
plt.plot(xData, yData4, color='y', linestyle='-', marker='o', label='Whole_network')  
plt.legend(loc='lower right')  
plt.savefig('D:\\kpi\\6.png', format='png')

#小區可用率
xData = qriqi      
yData1 = qkeyong
yData2 = tkeyong
yData3 = skeyong
yData4 = gkeyong
#plt.ylim(ymin = 97.00,ymax = 100) 
plt.figure(num=7, figsize=(6, 4))  
plt.title('7days-Cell_Availabilty', size=20)  
plt.xlabel('Date', size=14)  
plt.ylabel('percentage', size=14)
#plt.ylabel('y-axis', size=14)  
plt.plot(xData, yData1, color='b', linestyle='-', marker='o', label='QDN')  
plt.plot(xData, yData2, color='r', linestyle='-', marker='o', label='TR')
plt.plot(xData, yData3, color='g', linestyle='-', marker='o', label='Smallcell')
plt.plot(xData, yData4, color='y', linestyle='-', marker='o', label='Whole_network')  
plt.legend(loc='lower right')  
plt.savefig('D:\\kpi\\7.png', format='png')



#發郵件





#stmp伺服器設定
mail_host = 'smtp.qq.com'
mail_user = '[email protected]'
mail_pwd = 'luyPPPPPooo'

#收信人

#抄送

mail_cc = [ '[email protected]', '[email protected]' ]
#主送

mail_to = [ '[email protected]', '[email protected]', '[email protected]' ]
mail_bcc = '[email protected]'

#表頭資訊
msg = MIMEMultipart('alternative')
msg['From'] = mail_user
msg['Subject'] = 'KPI日報%s' % (he)
msg['To'] = ",".join( mail_to )
msg['Cc'] = ",".join( mail_cc )
msg['Bcc'] = mail_bcc

#text = "Hi!\n How are you?\nHere is the link you wanted:\nhttp://www.python.org-0000"  
html = """ 
<html> 
  <head></head> 
  <body> 
    <p>Hi:各位領導、同事<br> 
	以下是區域KPI,請閱
	
	
    <table border="1" width="1000">
    <tr>
       <td><img src="cid:1"></td>
	   <td><img src="cid:2"></td>
	   <td><img src="cid:3"></td>
    </tr>
		
    <tr>
       <td><img src="cid:4"></td>
	   <td><img src="cid:5"></td>
	   <td><img src="cid:6"></td>
	</tr>
	<tr>
    <td><img src="cid:7"></td>
	</tr>
     </table>  
    </p> 
  </body> 
</html> 
"""






#fp = open(r'C:\Users\fly\Documents\5211game\1.jpg', 'rb')  #開啟檔案
#msgImage = MIMEImage(fp.read()) #讀入 msgImage 中
#fp.close() #關閉檔案
#msgImage.add_header('Content-ID', '<0>')
#msg.attach(msgImage)


#把圖片新增到郵件正文-html-多個圖片,採用了for迴圈

for j in range(7):#我總共要用
    j=j+1
    fp = open(r'D:\kpi\%d.png' % (j), 'rb')
    msgImage = MIMEImage(fp.read())
    fp.close()
    msgImage.add_header('Content-ID', '<%d>' % (j))#把圖片新增到頭資訊
    msg.attach(msgImage)

#定義郵件內容的格式
#part1 = MIMEText(text, 'plain')  
part2 = MIMEText(html, 'html')

#把part2生成到郵件中去
#msg.attach(part1)  這裡沒用到part1  part1是純文字
msg.attach(part2)



#構造圖片型別的附件,本次未使用---開頭已經進行了宣告,生效如下命令即可直接使用  
#att = MIMEText(open(r'C:\Users\fly\Documents\5211game\新建文字文件.jpg', 'rb').read(), 'base64', 'utf-8')  
#att["Content-Type"] = 'application/octet-stream'  
#att["Content-Disposition"] = 'attachment; filename="新建文字文件.jpg"'  
#msg.attach(att)

#構造附件xls型別的附件
xlspart = MIMEApplication(open(r'D:\kpi\%s.xls' % (he), 'rb').read())
xlspart.add_header('Content-Disposition', 'attachment', filename='%s.xls' % (he))
msg.attach(xlspart)#把附件新增到郵件中



try:
    s = smtplib.SMTP()
    s = smtplib.SMTP_SSL(mail_host, 465 )
    s.connect(mail_host)
    #login
    s.login(mail_user, mail_pwd )
    #send mail
    s.sendmail(mail_user, mail_to, msg.as_string())
    s.close()
    print ('success')
except Exception as e:
    print ('Exception: ', e)
	
	

========================================================================================================================================================================================================================================================================效果圖:



相關推薦

python連線oracel資料庫提取資料製圖通過郵件傳送

總體要求:                通過python自動從oracle提取原始資料,對原始資料製圖,併發送郵件。發郵件時,通過oracle提取的資料儲存為excel作為附件傳送,圖片及相關文字內容通過郵件正文傳送。 =========================

12行程式碼教會你用python讀excel檔案提取資料生成條形碼

  一、需求分析 條形碼應用廣泛,尤其是人事、財務和庫管等等崗位,常需根據excel檔案成批生成條碼,如果是經常性天天做,用excel的自己控制元件還是很枯燥煩人的。 當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎麼去學習呢?  

Navicat 連線mysql資料庫資料顯示亂碼

解決方法: 1.navicat裡右擊一個連線,選擇連線屬性,切換到高階選項卡,去掉“使用mysql字符集”前的對勾,在編碼裡選擇utf-8,這種方法對於部分問題可能適合。 2.可能是mysql的配置檔案有問題,就是在mysql 的安裝目錄下的my.ini檔案

PowerDesigner連線oracle資料庫oracle資料匯入PowerDesigner

問題描述:由於很多資料庫都是用toad在oracle上建立的,但現在要把相應的表匯入到PowerDesigner中。 解決方法:介於現在很多人很多時候在建資料庫時都是用toad直接在oracle上建的。但需要用到關係圖時,又得一個表一個表的手動匯入到Powerdesigne

如何點選按鈕彈出新視窗輸入資料返回重新整理頁面?(C#程式碼)

namespace ShowModalTest{ /// <summary> /// WebForm1 的摘要說明。 /// </summary> public class WebForm1 : System.Web.UI.Page {  protected System.Web.UI

Jmeter連線mysql資料庫使用查詢到的資料

Jmeter怎樣配置連結到mysql,在這一篇: https://www.cnblogs.com/brigth-9V/p/8657987.html 對於得到的查詢結果,直接把某一列的值用到foreach控制器裡,進行迴圈。 1、配置JDBC的請求,每列都可以直接放到變數裡: 現在A代表的是name列

python連線MySQL資料庫讀取資料

# 匯入模組 import pymysql # 1.連線到mysql資料庫 conn = pymysql.connect(host='localhost', user='root', password='1234', db='mycommodity', cha

solr連線資料庫實現資料定時同步(個人專案經驗)

在專案開發過程中為了提高查詢效率和降低資料庫的壓力,因此此時就將查詢量大的資料放到solr中,查詢從solr中執行,不走資料庫,但是資料庫資料修改後怎麼辦呢,此時就要實現solr連線資料庫,實現資料的定時同步,保證資料的一致性。 solr的搭建看我另一篇部落格吧http:/

python 連線HANA庫寫入城鄉劃分程式碼(省市縣鎮鄉村5級)到資料庫

1 import pyhdb,re 2 def get_connection(): 3 conn_obj = pyhdb.connect( 4 host = "xxx.172.1.xxx", #HANA地址 5 port = 30015, #HANA埠號

PHP TP5 連線postgres資料庫獲取新增資料主鍵值

TP5 文件中::說明:新增資料,如果要獲取新增資料的自增ID  1.     使用Model,可以使用下面的方式: $user = new User; $user->na

impdp匯入資料連線資料庫但是一直等待

C:\Users\Administrator>impdp  boss/boss directory=dir   dumpfile=out-%u.dmp   remap_schema=boss:boss  remap_tablespace=NNC_DATA01:USER

python sqlite3 連線資料庫建立表INSERT 、SELECT、UPDATE 、DELETE等簡單操作

Python sqlite3 模組它提供了一個SQL介面相容。不需要單獨安裝這個模組,因為它預設情況下隨著Python版本在2.5.x 一起安裝。 要使用sqlite3模組,必須首先建立一個連線物件,表示資料庫中,然後可以選擇建立遊標物件,這將幫助在執行的所有

python 遠端連線MySQL資料庫 拉取資料存至本地檔案

1.連線資料庫 這裡預設大家都已經配置安裝好 MySQL 和 Python 的MySQL 模組,且預設大家的DB內表和訪問賬號許可權均已設定無誤,下面直接程式碼演示: # -*- codin

python連線SQLServer資料庫建立資料表同時為每個欄位加上對應的中文註釋資訊

      今天應產品那邊的需求更改,需要在原始的建立資料表的指令碼中加入註釋這一項,SQLServer資料庫其實我是很不熟的,這一段時間完全是因為專案的緣故才會比較多的接觸到這一塊內容,學習一下覺得挺好的。之前的建立表的指令碼寫的也是很low的,當然現在也是比較low的,但

Java連線HBASE資料庫建立一個表刪除一張表修改表輸出插入修改資料刪除資料獲取顯示錶資訊過濾查詢分頁查詢地理hash

準備工作 1、建立Java的Maven專案 建立好的目錄結構如下: 另外注意junit的版本,最好不要太高,最開始筆者使用的junit4.12的,發現執行的時候會報錯。最後把Junit的版本改成4.7的之後,問題解決了。 編寫POM檔案 <

利用C3P0連線連線mysql資料庫超過幾小時連線報wait_timeout錯誤

之前做了一個小專案,用的是C3P0連線池連線mysql資料庫,由於連線數目較小,隔天再連線發現報如下異常錯誤,然後重新重新整理後又正常: 之後檢視資料後發現是因為 :MySQL 的預設設定下,當一個連線的空閒時間超過8小時後,MySQL 就會斷開該連線,而 c3p0 連線

【ASP.NET】GridView連線資料庫顯示資料

前端 1、新增控制元件GridView,新增資料來源,接著按步驟選擇自己的資料庫 新增資料來源顯示資料有倆種方法: (1)一種方法是在GridView控制元件上直接按步驟新增資料來源,及設計想要顯

作為一款記憶體資料庫為什麼斷電Redis資料不會丟失

# 前言 `Redis` 作為一款記憶體資料庫,被廣泛使用於快取,分散式鎖等場景,那麼假如斷電或者因其他因素導致 `Reids` 服務宕機,在重啟之後資料會丟失嗎? # Redis 持久化機制 `Redis` 雖然是定義為一個記憶體資料庫,但是其也支援資料的持久化,在 `Redis` 中提供了兩種持久化

python連線各種資料庫的類方法

連線postgresql資料庫 import psycopg2 # 用來操作資料庫的類 class GPCommand(object): # 類的初始化 def __init__(self): self.hostname = '10.1.2.xx'

nodejs連線Access資料庫出現Error: Spawn C:\WINDOWS\SysWOW64\cscript.exe error Java專案生成可執行jar包、exe檔案以及在Windows下的安裝檔案

因為集成了第三方的資料庫,所以需要獲取資料庫的資料 使用 var connection = ADODB.open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+config.id_path+';');