天天看點

我的第一個python程式

斷斷續續自學python已經幾個月了,但是沒啥實質性的進展,特别是不常用,加上到面向對象之後,人都是暈暈的,這不是被迫要寫一個案例嘛!實作将産生的資料插入到execl中去,但是是追加的方式,而不是覆寫,然後算出平均值和插入圖表,最開始之前參考别人寫的文章用xlsxwriter子產品,但是後來發現這個隻能一次性寫入,資料會覆寫,是以棄之,用了xlrd和xlwt子產品。雖然暫時隻實作了資料能追加寫到execl中。

需求:一般我們選一個IDC機房,大多數的辦法是用ping的方式去測試,但是這隻能從icmp得出結果,我們試想一下除了icmp是不是還可以從tcp擷取結果呢?主要是探測web服務品質,用cron每小時去執行一次python腳本,然後将産生的資料按系統目前時間插入到execl表中去分析結果。相當于做一個網絡方面的測試。下面是一段代碼主要是參考某人的書籍中。

#!/usr/bin/python

#coding=utf-8

import os,sys

import time

import pycurl

import xlrd

import xlwt

import xlutils

from xlrd import open_workbook

from xlutils.copy import copy

URL="http://www.baidu.com"

now = time.strftime('%H%M%S')

n = int(now[:2])

c = pycurl.Curl()

c.setopt(pycurl.URL, URL)

c.setopt(pycurl.CONNECTTIMEOUT, 5)

c.setopt(pycurl.TIMEOUT, 5)

c.setopt(pycurl.NOPROGRESS, 1)

c.setopt(pycurl.FORBID_REUSE, 1)

c.setopt(pycurl.MAXREDIRS, 1)

c.setopt(pycurl.DNS_CACHE_TIMEOUT, 30)

indexfile = open(os.path.dirname(os.path.realpath(__file__))+"/content.txt","wb")

c.setopt(pycurl.WRITEHEADER, indexfile)

c.setopt(pycurl.WRITEDATA, indexfile)

try:

    c.perform()

except Exception,e:

    print "connection error:"+str(e)

    indexfile.close()

    c.close()

    sys.exit()

NAMELOOKUP_TIME = c.getinfo(c.NAMELOOKUP_TIME)

CONNECT_TIME = c.getinfo(c.CONNECT_TIME)

TOTAL_TIME = c.getinfo(c.TOTAL_TIME)

HTTP_CODE = c.getinfo(c.HTTP_CODE)

SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD)

HEADER_SIZE = c.getinfo(c.HEADER_SIZE)

SPEED_DOWNLOAD=c.getinfo(c.SPEED_DOWNLOAD)

print "HTTP狀态碼: %s" %(HTTP_CODE)

print "DNS解析時間: %.2f ms" %(NAMELOOKUP_TIME*1000)

print "建立連接配接時間: %.2f ms" %(CONNECT_TIME*1000)

print "傳輸結束總時間: %.2f ms" %(TOTAL_TIME*1000)

print "下載下傳資料包大小: %d bytes/s" %(SIZE_DOWNLOAD)

print "HTTP頭部大小: %d byte" %(HEADER_SIZE)

print "平均下載下傳速度: %d bytes/s" %(SPEED_DOWNLOAD)

indexfile.close()

c.close()

下面開始是我自己寫的代碼,可優化空間太大,作為一個初學者來說。請大家勿吐槽啊!

N = (0,1,2,3,4,5,6,7)

L = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)

H = (00,01,02,03,04,05,06,07,'08','09',10,11,12,13,14,15,16,17,18,19,20,21,22,23)

if not os.path.exists('chart.xlsx'):

    w = xlwt.Workbook()

    sheet = w.add_sheet('chart.xlsx')

    w.save('chart.xlsx')

    rb = open_workbook('chart.xlsx')

    wb = copy(rb)

    sheet = wb.get_sheet(0)

    sheet.write(N[0], L[0], URL)

    sheet.write(N[0], L[1], H[0])

    sheet.write(N[0], L[2], H[1])

    sheet.write(N[0], L[3], H[2])

    sheet.write(N[0], L[4], H[3])

    sheet.write(N[0], L[5], H[4])

    sheet.write(N[0], L[6], H[5])

    sheet.write(N[0], L[7], H[6])

    sheet.write(N[0], L[8], H[7])

    sheet.write(N[0], L[9], H[8])

    sheet.write(N[0], L[10], H[9])

    sheet.write(N[0], L[11], H[10])

    sheet.write(N[0], L[12], H[11])

    sheet.write(N[0], L[13], H[12])

    sheet.write(N[0], L[14], H[13])

    sheet.write(N[0], L[15], H[14])

    sheet.write(N[0], L[16], H[15])

    sheet.write(N[0], L[17], H[16])

    sheet.write(N[0], L[18], H[17])

    sheet.write(N[0], L[19], H[18])

    sheet.write(N[0], L[20], H[19])

    sheet.write(N[0], L[21], H[20])

    sheet.write(N[0], L[22], H[21])

    sheet.write(N[0], L[23], H[22])

    sheet.write(N[0], L[24], H[23])

    sheet.write(N[0], L[25], u'平均值')

    sheet.write(N[1], L[0], u'HTTP狀态碼')

    sheet.write(N[2], L[0], u'DNS解析時間')

    sheet.write(N[3], L[0], u'建立連接配接時間')

    sheet.write(N[4], L[0], u'傳輸結束總時間')

    sheet.write(N[5], L[0], u'下載下傳資料包大小')

    sheet.write(N[6], L[0], u'HTTP頭部大小')

    sheet.write(N[7], L[0], u'平均下載下傳速度')

    wb.save('chart.xlsx')

if n == 0:

    sheet.write(N[1], L[1], HTTP_CODE)

    sheet.write(N[2], L[1], NAMELOOKUP_TIME*1000)

    sheet.write(N[3], L[1], CONNECT_TIME*1000)

    sheet.write(N[4], L[1], TOTAL_TIME*1000)

    sheet.write(N[5], L[1], SIZE_DOWNLOAD)

    sheet.write(N[6], L[1], HEADER_SIZE)

    sheet.write(N[7], L[1], SPEED_DOWNLOAD)

elif n == 1:

    sheet.write(N[1], L[2], HTTP_CODE)

    sheet.write(N[2], L[2], NAMELOOKUP_TIME*1000)

    sheet.write(N[3], L[2], CONNECT_TIME*1000)

    sheet.write(N[4], L[2], TOTAL_TIME*1000)

    sheet.write(N[5], L[2], SIZE_DOWNLOAD)

    sheet.write(N[6], L[2], HEADER_SIZE)

    sheet.write(N[7], L[2], SPEED_DOWNLOAD)

......此刻省去了很多行,因為都是一樣,隻需要将==遞增就行,然後L[X]中的值也是遞增。

elif n == 23:

    sheet.write(N[1], L[24], HTTP_CODE)

    sheet.write(N[2], L[24], NAMELOOKUP_TIME*1000)

    sheet.write(N[3], L[24], CONNECT_TIME*1000)

    sheet.write(N[4], L[24], TOTAL_TIME*1000)

    sheet.write(N[5], L[24], SIZE_DOWNLOAD)

    sheet.write(N[6], L[24], HEADER_SIZE)

    sheet.write(N[7], L[24], SPEED_DOWNLOAD)

else:

    print '資料插入錯誤!'

最後我們用crontab每整點運作一次腳本。就可以看到資料啦!

下面大家看一下效果圖啊!

需要改進的地方:

1、産生的excel檔案肯定需要加上每天日期命名,并且是每天建立一個。

2、這個子產品不知道如何求平均值。

3、不會插入圖表。

這些問題争取在下一篇部落格中解決哈!