1. 程式人生 > >DevOpps python常用庫嘗鮮

DevOpps python常用庫嘗鮮

mil mail 布局 affinity jpeg 散點 邏輯cpu gin rtt

#devopps with python
###python庫 psutil
<pre>
1.安裝
<pre>
pip install psutil
</pre>
2.使用
<pre>
(1)獲取cpu信息
<pre>
#encoding=utf-8

import psutil

#使用cpu_times方法獲取cpu完整信息,需要顯示所有邏輯CPU信息
#制定方法變量percpu=True即可,如pstuil.cpu_times(percpu=True)
cpu_times = psutil.cpu_times()
print(cpu_times)

all_info_of_cpu_times = psutil.cpu_times(percpu=True)

print(all_info_of_cpu_times)

#獲取單項數據信息,如用戶user的cpu時間比
cpu_times_user = psutil.cpu_times().user
print(cpu_times)

#獲取cpu的邏輯個數,默認logical=True
logical_cpu_count = psutil.cpu_count()
print(logical_cpu_count)

#獲取cpu的物理個數
physic_cpu_count = psutil.cpu_count(logical=False)
print(physic_cpu_count)
</pre>
(2)獲取內存信息

<pre>
#encoding=utf-8

import psutil

#使用psutil.virtual_memory方法獲取內存完整信息
mem = psutil.virtual_memory()
print(mem)

#獲取內存總數
mem_size = mem.total
print(mem_size)

#獲取空閑內存數
mem_free = mem.free
print(mem_free)

#獲取swap分區信息
mem_swap = psutil.swap_memory()
print(mem_swap)
</pre>
(3)獲取磁盤信息
<pre>
#encoding=utf-8

import psutil

#使用psutil.disk_partitions方法獲取磁盤完整信息
disk_infos = psutil.disk_partitions()
for info in disk_infos:
print(info)

#使用psutil.disk_usage方法獲取分區(參數)的使用情況
disk_usages = psutil.disk_usage(‘/‘)
#for k,v in enumerate(disk_usages):

print(k,v)

print(disk_usages)
#for info in disk_usages:

print(info)

#使用psutil.disk_io_counters獲取磁盤總的IO個數、讀寫信息
io_info = psutil.disk_io_counters()
print(io_info)

#"perdisk = True" 參數獲取單個分區IO個數、讀寫信息
io_signal_info = psutil.disk_io_counters(perdisk=True)
print(io_signal_info)

</pre>
(4)獲取網絡信息
<pre>
#encoding=utf-8

import psutil

#使用psutil.net_io_counters獲取網絡總的IO信息,默認pernic = False
net_info = psutil.net_io_counters()
print(net_info)

#pernic=True輸出每個網絡接口的IO信息
net_info_detal = psutil.net_io_counters(pernic=True)
print(net_info)
</pre>
(5)其他系統信息
<pre>
#encoding=utf-8

import psutil
import datetime

#使用psutil.users方法返回當前登錄系統的用戶信息
login_user_info = psutil.users()
print(login_user_info)

#使用psutil.boot_time方法獲取開機時間,以Linux時間戳格式返回
boot_time = psutil.boot_time()
time = datetime.datetime.fromtimestamp(boot_time).strftime("%Y-%m-%d %H:%M:%S")
print("Boot time: ",time)
</pre>
進程管理
<pre>
#encoding=utf-8

import psutil

#列出所有進程PID

pids = psutil.pids()

print(pids)

#實例化一個Process對象,參數為一進程PID
p = psutil.Process(5926)
#進程名
print(p.name())
#進程bin路徑
print(p.exe())
#進程工作目錄絕對路徑
print(p.cwd())
#進程狀態
print(p.status())
#進程創建時間,時間戳格式
print(p.create_time())

#進程uid信息
print(p.uids())
#進程gid信息
print(p.gids())
#進程CPU時間信息,包括user、system兩個cpu時間
print(p.cup_times())
#get進程cpu親和度,如果設置進程cpu親和度,講cpu號作為參數即可
print(p.cpu_affinity())
#進程內存利用率
print(p.memory_percent())
#進程內存rss、vms信息
print(p.memory_info())
#進程IO信息,包括讀寫IO數以及字節數
print(p.io_counters())
#返回打開進程socket的namedutples列表,包括fs、family、laddr等信息
print(p.connections())
#進程開啟的線程數
print(p.num_threads())
</pre>
<pre>
#encoding=utf-8

import psutil

from subprocess import PIPE

#通過psutil的Popen方法啟動的應用程序,可以跟蹤該程序運行的所有相關信息
#p = psutil.Popen([r"/user/bin/python","-c","print(‘hello‘)"],stdout=PIPE)
p = psutil.Popen([r"python","-c","print(‘hello‘)"],stdout=PIPE)

print(p.name())
print(p.username())
print(p.communicate())
#得到進程運行的CPU時間
print(p.cpu_times())
</pre>
</pre>
</pre>

##IPy庫
<pre>
#encoding=utf-8

from IPy import IP

ip = IP(‘192.168.0.0/16‘)

#輸出192.168.0.0/16網段的IP個數
print ip.len()

#輸出192.168.0.0/16網段的所有IP清單

for x in ip:
print(x)

#encoding=utf-8

from IPy import IP
ip = IP(‘192.168.1.20‘)
#反向解析地址格式
print(ip.reverseNames())

#192.168.1.20為私網類型 ‘PRIVATE‘
print(ip.iptype())

#8.8.8.8為公網類型
print(IP(‘8.8.8.8‘).iptype())

#轉換為整型格式
print(IP(‘8.8.8.8‘).int())

#轉換為十六進制格式
print(IP(‘8.8.8.8‘).strHex())

#轉換為二進制格式
print(IP(‘8.8.8.8‘).strBin())

#十六進制轉換為IP格式
print(IP(0x80808080))

print(IP(‘192.168.1.0‘).make_net(‘255.255.255.0‘))
print(IP(‘192.168.1.0/255.255.255.0‘,make_net=True))
print(IP(‘192.168.1.0-192.168.1.255‘,make_net=True))

#wantprefixlen=0 無返回
print(IP(‘192.168.1.0/24‘).strNormal(0))

#prefix格式,如192.168.1.0/24
print(IP(‘192.168.1.0/24‘).strNormal(1))

#decimalnetmask格式,如192.168.1.0/255.255.255.0
print(IP(‘192.168.1.0/24‘).strNormal(2))

#lastIP格式,如192.168.1.0-192.168.1.255
print(IP(‘192.168.1.0/24‘).strNormal(3))

print(IP(‘10.0.0.0/24‘)<IP(‘12.0.0.0/24‘))

print(‘192.168.1.100‘ in IP(‘192.168.1.0/24‘))

print(IP(‘192.168.1.0/24‘) in IP(‘192.168.0.0/16‘))

#判斷兩個網段是否存在重疊
print(IP(‘192.168.0.0/23‘).overlaps(‘192.168.1.0/24‘))
#返回1代表存在重疊

print(IP(‘192.168.1.0/24‘).overlaps(‘192.168.2.0‘))
#返回0代表不存在重疊

<pre>

綜合例子

#encoding=utf-8

from IPy import IP

#接收用戶輸入,參數為IP地址或網段地址
ip_s = raw_input(‘Please input an IP or net-range: ‘)

ips = IP(ip_s)

#為一個網絡地址

if len(ips) > 1:
#輸出網絡地址
print(‘net: %s‘%ips.net())
#輸出網絡掩碼地址
print(‘netmask: %s‘%ips.netmask())
#輸出網絡廣播地址
print(‘broadcast:%s‘%ips.broadcast())
#輸出地址反向解析
print(‘reverse address: %s‘%ips.reverseNames()[0])
#輸出網絡子網數
print(‘subnet: %s‘%len(ips))
#為單個IP地址
else:
#輸出ip反向解析
print(‘reverse address: %s‘%ips.reverseNames()[0])

#輸出十六進制地址
print(‘hexadecimal: %s‘%ips.strHex())

#輸出二進制地址
print(‘binary ip: %s‘%ips.strBin())

#輸出地址類型,如PRIVATE、PUBLIC、LOOPBACK等
print(‘iptype: %s‘%ips.iptype())

</pre>
</pre>
##dnspython庫
<pre>
dnspython的DNS解析器類 resolver的query方法實現域名的查詢功能。

query(self,qname,rdtype=1,rdclass=1,tcp=False,source=None,raise_on_no_answer=True,source_port=0)

qname參數為查詢的域名。rdtype參數用來指定RR資源的類型
常用的有以下幾種:

A記錄,將主機名轉換成IP地址

MX記錄,郵件交換記錄,定義郵件服務器的域名

CNAME記錄,指別名記錄,實現域名間的映射

NS記錄,標記區域的域名服務器及授權子域

PTR記錄,反向解析,與A記錄相反,將IP轉換成主機名

SOA記錄,SOA標記,一個起始授權區的定義
<pre>
A記錄
實現A記錄查詢方法源碼

#encoding=utf-8

import dns.resolver

#輸入域名地址
domain = raw_input(‘Please input an domain: ‘)

#指定查詢類型為A記錄
A = dns.resolver.query(domain,‘A‘)

#通過response.answer方法獲取查詢回應信息
for i in A.response.answer:
#遍歷回應信息
for j in i.items:
print(j)
</pre>
<pre>
MX記錄
實現MX記錄查詢方法源碼

#encoding=utf-8

import dns.resolver

domain = raw_input(‘Please input an domain: ‘)

#指定查詢類型為MX記錄
MX = dns.resolver.query(domain,‘MX‘)

#遍歷回應結果,輸出MX記錄的preference及exchanger信息
for i in MX:
print(‘MX preference = ‘,i.preference,‘mail exchanger =‘,i.exchange)

</pre>
<pre>
NS記錄
實現NS記錄查詢方法源碼

#encoding=utf-8

import dns.resolver

domain = raw_input(‘Please input an domain: ‘)
#指定查詢類型為NS記錄
ns = dns.resolver.query(domain,‘NS‘)

for i in ns.response.answer:
for j in i.items:
print(j.to_text())
</pre>

<pre>
CNAME記錄
實現CNAME記錄查詢方法源碼

#encoding=utf-8

import dns.resolver

domain = raw_input(‘Please input an domain: ‘)

#指定查詢類型為CNAME記錄
cname = dns.resolver.query(domain,‘CNAME‘)

#結果將回應cname後的目標域名
for i in cname.response.answer:
for j in i.items:
print(j.to_text())
</pre>
<pre>
綜合實例

#encoding=utf-8

import dns.resolver
import os
import httplib

#定義域名IP列表變量
iplist = []
#定義業務域名
appdomain="www.google.com.hk"

#域名解析函數,解析成功IP將被追加到iplist
def get_iplist(domain=""):
try:
#解析A記錄類型
A = dns.resolver.query(domain,‘A‘)
except Exception,e:
print("dns resolver error: "+str(e))
return
for i in A.response.answer:
for j in i.items:
#追加到iplist
iplist.append(j.address)
return True

def checkip(ip):
checkurl = ip + ":80"
getcontent = ""
#定義http連接超時時間(5秒)
httplib.socket.setdefaulttimeout(5)
#創建http連接對象
conn = httplib.HTTPConnection(checkurl)

#發起URL請求,添加host主機頭
try:
    conn.request("GET","/",headers={"Host":appdomain})
    r = conn.getresponse()
    #獲取URL頁面前15個字符,以便做可用性校驗
    getcontent = r.read(15)
finally:
    #監控URL頁的內容一般是事先定義好的,比如"HTTP200"等

    if getcontent == "<!doctype html>":
        print(ip + " [OK]")
    else:
        #此處可放告警程序,可以是郵件、短信通知
        print(ip + " [Error]")

if name == "main":
#條件: 域名解析正確且至少返回一個IP
if get_iplist(appdomain) and len(iplist)>0:
for ip in iplist:
checkip(ip)
else:
print("DNS resolver error.")

</pre>

</pre>
##difflib模塊
<pre>
<pre>
實例一

#encoding=utf-8

import difflib

#定義字符串1
text1 = """text1:
This module provides classes and functions for comparing sequences.
including HTML and context and unified diffs.
difflib document v7.4
add string
"""

#以行進行分隔,以便進行對比
text1_lines = text1.splitlines()

#定義字符串2
text2 = """text2:
This module provides classes and functions for Comparing sequences.
including HTML and context and unified diffs.
difflib document v7.5"""

text2_lines = text2.splitlines()

#創建Differ()對象
#d = difflib.Differ()
d = difflib.HtmlDiff()
#采用compare方法對字符串進行比較
#diff = d.compare(text1_lines,text2_lines)
#print(‘\n‘.join(list(diff)))

print(d.make_file(text1_lines,text2_lines))
</pre>
<pre>
實例二 服務器配置文件差異比較

#encoding=utf-8

import difflib
import sys

try:
#第一個配置文件路徑參數
#textfile1 = sys.argv[1]
textfile1 = r"D:\python_code\devopps\config.ini.v1";

#第二個配置文件路徑參數
#textfile2 = sys.argv[2]
textfile2 = r"D:\python_code\devopps\config.ini.v2";

except Exception,e:
print("Error: "+str(e))
print("Usage: confFileDiff.py filename1 filename2")
sys.exit()

#文件讀取分隔函數
def readfile(filename):
try:
fileHandle = open(filename,‘rb‘)
#讀取後以進行分隔
text = fileHandle.read().splitlines()
fileHandle.close()
return text
except IOError as error:
print(‘Read file Error: ‘+str(error))
sys.exit()

if textfile1=="" or textfile2=="":
print("Usage: confFileDiff.py filename1 filename2")
sys.exit()

#調用readfile函數,獲取分隔後的字符串
text1_lines = readfile(textfile1)
text2_lines = readfile(textfile2)

#創建HtmlDiff()類對象
d = difflib.HtmlDiff()

#通過make_file方法輸出HTML格式的比對結果
print(d.make_file(text1_lines,text2_lines))
</pre>
</pre>
##filecmp模塊
<pre>
filecmp提供了三個操作方法,分別是:
<pre>
cmp 單文件對比
采用filecmp.cmp(f1,f2[,shallow])方法,比較文件名為f1和f2的文件,相同返回True,
不相同返回False,shallow默認為True,意思是只根據os.stat()方法返回的文件基本信息
進行對比,
比如最後訪問時間、修改時間、狀態改變時間等,會忽略文件內容的對比。當shallow為False時,
則os.stat()與文件內容同時進行校驗。
</pre>
<pre>
cmpfiles 多文件對比
采用filecmp.cmpfiles(dir1,dir2,common[,shallow])方法,對比dir1與dir2目錄給定的
文件清單。
該方法返回文件名的三個列表,分別為匹配、不匹配、錯誤。
匹配為包含匹配的文件的列表,不匹配反之,錯誤列表包括了目錄不存在文件、不具備讀權限或
其他原因導致的不能比較的文件清單。
</pre>

<pre>
dircmp 目錄對比
通過dircmp(a,b[,ignore[,hide]])類創建一個目錄的比較對象,其中a和b是參加比較的目錄名。
ignore代表文件名忽略的列表,並默認為[‘RCS‘,‘CVS‘,‘tags‘]
hide代表隱藏的列表,默認為[os.curdir,os.pardir]
dircmp類可以獲得目錄比較的詳細信息,如只有在a目錄中包括的文件、a與b都在的子目錄、
匹配的文件等,同時支持遞歸

<pre>
dircmp提供了三個輸出報告的方法:
report() 比較當前指定目錄中的內容
report_partial_closure() 比較當前指定目錄及第一級子目錄中的內容
report_full_closure() 遞歸比較所有指定目錄的內容。
</pre>
<pre>
為了輸出更加詳細的比較結果,dircmp類還提供了以下屬性:
left 左目錄,如類定義中的a
right 右目錄,如類定義中的b
left_list 左目錄中的文件及目錄列表
right_list 右目錄中的文件及目錄列表
common 兩邊目錄共同存在的文件或目錄
left_only 只在左目錄中的文件或目錄
right_only 只在右目錄中的文件或目錄
common_dirs 兩邊目錄都存在的子目錄
common_files 兩邊目錄都存在的子文件
common_funny 兩邊目錄都存在的子目錄(不同目錄類型或os.stat()記錄的錯誤)
same_files 匹配相同的文件
diff_files 不匹配的文件
funny_files 兩邊目錄中都存在,但無法比較的文件
subdirs 將common_dirs目錄名映射到新的dircmp對象,格式為字典類型
</pre>
<pre>
實例一

#encoding=utf-8

import filecmp

#定義左目錄
a = r"D:\python_code"

#定義右目錄
b = r"D:\SpiderData"

#目錄比較,忽略test.py文件
dirobj = filecmp.dircmp(a,b,[‘test.py‘])

#輸出對比結果數據報表,詳細說明請參考filecmp類方法及屬性信息

dirobj.report()
dirobj.report_partial_closure()
dirobj.report_full_closure()
print("left_list: "+str(dirobj.left_list))
print("right_list: "+str(dirobj.right_list))
print("common: "+str(dirobj.common))
print("left_only: "+str(dirobj.left_only))
print("right_only: "+str(dirobj.right_only))
print("common_dirs: "+str(dirobj.common_dirs))
print("common_files: "+str(dirobj.common_files))
print("common_funny: "+str(dirobj.common_funny))
print("same_file: "+str(dirobj.same_files))
print("diff_files: "+str(dirobj.diff_files))
print("funny_files: "+str(dirobj.funny_files))
</pre>
</pre>
</pre>
##pycurl
<pre>
<pre>
pycurl.Curl()類實現了創建一個libcurl包的Curl句柄對象,無參數
Curl對象的幾個方法:

close()方法,對應libcurl包中的curl_easy_cleanup方法,無參數,實現關閉、回收Curl對象。

perform()方法,對應libcurl包中的curl_easy_perform方法,無參數,實現Curl對象請求的提交。

setopt(option,value)方法,對應libcurl包中的curl_easy_setopt方法,
參數option是通過libcurl的常量來指定的,參數value的值會依賴option,
可以是一個字符串、×××、長整型、文件對象、列表或函數等。

getinfo(option)方法,對應libcurl包中的curl_easy_getinfo方法,
參數option是通過libcurl的常量來指定的。
</pre>
<pre>

-- coding: utf-8 --

import os
import time
import sys
import pycurl

#探測的目標URL
URL="http://www.baidu.com"
#創建一個curl對象
c = pycurl.Curl()
#定義請求的URL常量
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)
#指定HTTP重定向的最大數為1
c.setopt(pycurl.MAXREDIRS,1)
#設置保存DNS信息的時間為30秒
c.setopt(pycurl.DNS_CACHE_TIMEOUT,30)

#創建一個文件對象,以"wb"方式打開,用來存儲返回的http頭部及頁面內容
indexfile = open(os.path.dirname(os.path.realpath(file))+"/content.txt","wb")
#將返回的HTTP HEADER定向到indexfile文件
c.setopt(pycurl.WRITEHEADER,indexfile)
#將返回的HTML內容定向到indexfile文件對象
c.setopt(pycurl.WRITEDATA,indexfile)
try:
#提交請求
c.perform()
except Exception,e:
print("connection error: "+str(e))
indexfile.close()
c.close()
sys.exit()

#獲取DNS解析時間
NAMELOOKUP_TIME = c.getinfo(c.NAMELOOKUP_TIME)
#獲取建立連接時間
CONNECT_TIME = c.getinfo(c.CONNECT_TIME)
#獲取從建立連接到準備傳輸所耗的時間
PRETRANSFER_TIME = c.getinfo(c.PRETRANSFER_TIME)
#獲取從建立連接到傳輸開始消耗的時間
STARTTRANSFER_TIME = c.getinfo(c.STARTTRANSFER_TIME)
#獲取傳輸的總時間
TOTAL_TIME = c.getinfo(c.TOTAL_TIME)
#獲取HTTP狀態碼
HTTP_CODE = c.getinfo(c.HTTP_CODE)
#獲取下載數據包大小
SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD)
#獲取HTTP頭部大小
HEADER_SIZE = c.getinfo(c.HEADER_SIZE)
#獲取平均下載速度
SPEED_DOWNLOAD = c.getinfo(c.SPEED_DOWNLOAD)

#打印輸出相關數據

print("HTTP狀態碼: %s"%HTTP_CODE)
print("DNS解析時間: %.2f ms"%(NAMELOOKUP_TIME1000))
print("建立連接時間:%.2f ms"%(CONNECT_TIME
1000))
print("準備傳輸時間:%.2f ms"%(PRETRANSFER_TIME1000))
print("傳輸開始時間:%.2f ms"%(STARTTRANSFER_TIME
1000))
print("傳輸結束總時間:%.2f ms"%(TOTAL_TIME*1000))
print("下載數據包大小: %d byte"%(SIZE_DOWNLOAD))
print("HTTP頭部大小: %d byte"%(HEADER_SIZE))
print("平均下載速度: %d bytes/s"%(SPEED_DOWNLOAD))

#關閉文件及curl對象
indexfile.close()
c.close()
<pre>
結果如下:

HTTP狀態碼: 200
DNS解析時間: 0.00 ms
建立連接時間:32.00 ms
準備傳輸時間:32.00 ms
傳輸開始時間:47.00 ms
傳輸結束總時間:110.00 ms
下載數據包大小: 117121 byte
HTTP頭部大小: 929 byte
平均下載速度: 1064736 bytes/s

請按任意鍵繼續. . .
</pre>
</pre>
</pre>
##xlsxwriter庫
<pre>
<pre>
Workbook類

Workbook(filename[,options])
Workbook代表整個電子表格文件,並且存儲在磁盤上

參數:
filename(String類型) 為創建的Excel文件存儲路徑
options(Dict類型)為可選的Workbook參數,一般作為初始化工作表內容格式,
例如值為{‘strings_to_numbers‘:True}表示使用worksheet.write()方法時激活字符串轉換數字
<pre>
方法:
1.add_worksheet([sheetname])方法,作用是添加一個新的工作表,參數
參數sheetname(String類型)為可選的工作表名稱,默認為Sheet1。
worksheet1 = workbook.add_worksheet() #Sheet1
worksheet2 = workbook.add_worksheet(‘Foglio2‘) #Foglio2
worksheet3 = workbook.add_worksheet(‘Data‘) #Data
worksheet4 = workbook.add_worksheet() #Sheet4

2.add_format([properties])方法,作用是在工作表中創建一個新的格式對象來格式化單元格。
參數properties(dict類型)為指定一個格式屬性字典,例如設置一個
加粗的格式對象,workbook.add_format({‘bold‘:True})
通過Format methods(格式化方法)也可以實現格式的設置,等價的設置加粗格式代碼如下
bold = workbook.add_format()
bold.set_bold()

3.add_chart(options)方法,作用是在工作表中創建一個圖表對象,內部是通過insert_chart()方法來實現,
參數options(dict類型)為圖表指定一個字典屬性,例如
設置一個線條類型的圖表對象,代碼為
chart = workbook.add_chart({‘type‘:‘line‘})

4.close()方法,作用是關閉工作表文件,如workbook.close()
</pre>
Worksheet類--將數據寫入單元格或工作表格式布局等
Worksheet對象不能直接實例化,取而代之的是通過Workbook對象
調用add_worksheet()方法來創建。
<pre>
方法:
1.write(row,col,args)方法,作用是寫普通數據到工作表的單元格,
參數row為行坐標,col為列坐標,坐標索引起始值為0;
args無名字參數為數據內容,可以為數字、公式、字符串或格式對象。
為了簡化不同數據類型的寫入過程,write方法已經作為其他更加具體
數據類型方法的別名,包括:
(1)write_string() 寫入字符串類型數據,如:
worksheet.write_string(0,0,‘Your text here‘)
(2)write_number() 寫入數字類型數據,如:
worksheet.write_number(‘A2‘,2.3451)
(3)write_blank() 寫入空類型數據,如:
worksheet.write(‘A2‘,None)
(4)write_formula() 寫入公式類型數據,如:
worksheet.write_formula(2,0,‘=SUM(B1:B5)‘)
(5)write_datetime() 寫入日期類型,如:
worksheet.write_datetime(7,0,datetime.datetime.strptime(‘2013-01-23‘,‘%Y-%m-%d‘),workbook.add_format({‘num_format‘:‘yyyy-mm-dd‘}))
(6)write_boolean() 寫入邏輯類型數據,如:
worksheet.write_boolean(0,0,True)
(7)write_url() 寫入超鏈接類型數據,如:
worksheet.write_url(‘A1‘,‘ftp://www.python.org/‘)

2.set_row(row,height,cell_format,options)方法,作用是設置行單元格的屬性。
參數:
row(int類型)指定行位置,起始下標為0
height(float類型)設置行高,單位像素
cell_format(format類型)指定格式對象
options(dict類型)設置行hidden(隱藏)、level(組合分級)、collapsed(折疊)
操作示例如下:
#在A1單元格寫入‘Hello‘字符串
worksheet.write(‘A1‘,‘Hello‘)
#定義一個加粗的格式對象
cell_format = workbook.add_format({‘bold‘:True})
#設置第1行單元格高度為40像素,且引用加粗格式對象
worksheet.set_row(0,40,cell_format)
#隱藏第2行單元格
worksheet.set_row(1,None,None,{‘hidden‘:True})

3.set_column(first_col,last_col,width,cell_format,options)方法,作用是設置一列或多列單元格屬性。
參數:
first_col(int類型)指定開始列位置,起始下標為0
last_col(int類型)指定結束列位置,起始下標為0,可以設置成與first_col一樣。
width(float類型)設置列寬
cell_format(Format類型)指定格式對象
options(dict類型)設置行hidden(隱藏)、level(組合分級)、collapsed(折疊)。
操作示例如下:
#在A1單元格寫入‘Hello‘字符串
worksheet.write(‘A1‘,‘Hello‘)

#在B1單元格寫入‘World‘字符串
worksheet.write(‘B1‘,‘World‘)

#定義一個加粗的格式對象
cell_format = workbook.add_format({‘bold‘:True})

#設置0到1即(A到B)列單元格寬度為10像素,且引用加粗格式對象
worksheet.set_column(0,1,10,cell_format)

#設置C到D列單元格寬度為20像素
worksheet.set_column(‘C:D‘,20)

#隱藏E到G列單元格
worksheet.set_column(‘E:G‘,None,{‘hidden‘:1})

4.insert_image(row,col,image[,options])方法,作用是插入圖片到指定單元格,
支持PNG、JPEG、BMP等圖片格式。
參數:
row 為行坐標
col 為列坐標,坐標索引起始值為0,
image(string類型)為圖片路徑
options(dict類型)為可選參數,作用是指定圖片的位置、比例、鏈接URL信息。
操作示例如下:
#在B5單元格插入python-logo.png圖片,圖片超級鏈接為http://python.org
worksheet.insert_image(‘B5‘,‘img/python-logo.png‘,{‘url‘:‘http://python.org‘})
</pre>
Chart類
支持的圖表類型包括面積、條形圖、柱形圖、折線圖、餅圖、散點圖、股票和雷達等
圖表對象是通過Workbook(工作簿)的add_chart方法創建,通過{type,‘圖表類型‘}字典參數指定圖表的類型
語句如下:
#創建一個column(柱形)圖表
chart = workbook.add_chart({type,‘column‘})
<pre>
更多圖表類型說明:
area:創建一個面積樣式的圖表
bar:創建一個條形樣式的圖表
column:創建一個柱形樣式的圖表
line:創建一個線條樣式的圖表
pie:創建一個餅圖樣式的圖表
scatter:創建一個散點樣式的圖表
stock:創建一個股票樣式的圖表
radar:創建一個雷達樣式的圖表
</pre>
然後再通過Worksheet(工作表)的insert_chart()方法插入到指定位置,語句如下:
#在A7單元格插入圖表
worksheet.insert_chart(‘A7‘,chart)
<pre>
chart類常用方法:
1.chart.add_series(options)方法,作用為添加一個數據系列到圖表,
參數
options(dict類型)設置圖表系列選項的字典,操作示例如下:
chart.add_series({
‘categories‘:‘=Sheet1!$A$1:$A$5‘,
‘values‘: ‘=Sheet1!$B$1:$B$5‘,
‘line‘:{‘color‘:‘red‘},
})

add_series方法最常用的三個選項為categories、value、line
categories 設置圖表類別標簽範圍
values 設置圖表數據範圍
line 設置圖表線條屬性,包括顏色、寬度等

其他常用方法及示例
set_x_axis(options)方法,設置圖表X軸選項,示例代碼如下:

chart.set_x_axis({
#設置x軸標題名稱
‘name‘:‘Earnings per Quarter‘,
#設置x軸標題字體屬性
‘name_font‘:{‘size‘:14,‘bold‘:True},
#設置x軸數字字體屬性
‘num_font‘:{‘italic‘:True},

})

set_size(options)方法,設置圖表大小,如chart.set_size({
‘width‘:720,‘height‘:576})
其中width為寬度,height為高度

set_title(options)方法,設置圖表標題,如chart.set_title({
‘name‘:‘Year End Results‘})

set_style(style_id)方法,設置圖表樣式,style_id為不同數字則代表不同樣式,
如chart.set_style(37)

set_table(options)方法,設置X軸為數據表格形式,如chart.set_table(),

</pre>

</pre>

<pre>
簡單實例

-- coding:utf-8 --

import xlsxwriter

#創建一個Excel文件
workbook = xlsxwriter.Workbook(‘demo1.xlsx‘)
#創建一個工作表對象
worksheet = workbook.add_worksheet()

#設定第一列(A)寬度為20像素
worksheet.set_column(‘A:A‘,20)
#定義一個加粗的格式對象
bold = workbook.add_format({‘bold‘:True})
#A1單元格寫入‘Hello‘
worksheet.write(‘A1‘,‘Hello‘)
#A2單元格寫入‘World‘並引用加粗格式對象bold
worksheet.write(‘A2‘,‘World‘,bold)
#B2單元格寫入中文並引用加粗格式對象bold
worksheet.write(‘B2‘,u‘中文測試‘,bold)
#用行列表示法寫入數字‘32‘與‘35.5‘
worksheet.write(2,0,32)
#行列表示法的單元格下標以0作為起始值,‘3,0‘等價於‘A3‘
worksheet.write(3,0,35.5)
#求A3:A4的和,並將結果寫入‘4,0‘,即‘A5‘
worksheet.write(4,0,‘=SUM(A3:A4)‘)
#在B5單元格插入圖片
#worksheet.insert_image(‘B5‘,‘img/python-logo.png‘)
#關閉Excel文件
workbook.close()
</pre>
<pre>
#coding:utf-8

import xlsxwriter

#創建一個Excel文件
workbook = xlsxwriter.Workbook(‘chart.xlsx‘)
#創建一個工作表對象
worksheet = workbook.add_worksheet()
#創建一個圖表對象
chart = workbook.add_chart({‘type‘:‘column‘})
#定義數據表頭列表
title = [u‘業務名稱‘,u‘星期一‘,u‘星期二‘,u‘星期三‘,u‘星期四‘,u‘星期五‘,u‘星期六‘,u‘星期日‘,u‘平均流量‘]
#定義頻道名稱
buname = [u‘業務官網‘,u‘新聞中心‘,u‘購物頻道‘,u‘體育頻道‘,u‘親子頻道‘]
#定義5頻道一周7天流量數據列表

data = [
[150,152,158,149,155,145,148],
[89,88,95,93,98,100,99],
[201,200,198,175,170,198,195],
[75,77,78,78,74,70,79],
[88,85,87,90,93,88,84],
]

#定義format格式對象
format = workbook.add_format()
#定義format對象單元格邊框加粗(1像素)的格式
format.set_border(1)

#定義format_title格式對象
format_title = workbook.add_format()
#定義format_title對象單元格邊框加粗(1像素)的格式
format_title.set_border(1)
#定義format_title對象單元格背景顏色為#cccccc格式
format_title.set_bg_color(‘#cccccc‘)
#定義format_title對象單元格居中對齊的格式
format_title.set_align(‘center‘)
#定義format_title對象單元格內容加粗的格式
format_title.set_bold()
#定義format_ave格式對象
format_ave = workbook.add_format()
#定義format_ave對象單元格邊框加粗(1像素)的格式
format_ave.set_border(1)
#定義format_ave對象單元格數字類別顯示格式
format_ave.set_num_format(‘0.00‘)

#下面分別以行或列寫入方式將標題、業務名稱、流量數據寫入起始單元格,同時引用不同格式對象
worksheet.write_row(‘A1‘,title,format_title)
worksheet.write_column(‘A2‘,buname,format)
worksheet.write_row(‘B2‘,data[0],format)
worksheet.write_row(‘B3‘,data[1],format)
worksheet.write_row(‘B4‘,data[2],format)
worksheet.write_row(‘B5‘,data[3],format)
worksheet.write_row(‘B6‘,data[4],format)

#定義圖表數據系列函數
def chart_series(cur_row):
#計算(AVERAGE函數)頻道周平均流量
worksheet.write_formula(‘I‘+cur_row,‘=AVERAGE(B‘+cur_row+‘:H‘+cur_row+‘)‘,format_ave)
chart.add_series({
#將"星期一至星期日"作為圖表數據標簽(x軸)
‘categories‘:‘=Sheet1!$B$1:$H$1‘,
#頻道一周所有數據作為數據區域
‘values‘:‘=Sheet1!$B$‘+cur_row+‘:$H$‘+cur_row,
#線條顏色定義為black(黑色)
‘line‘: {‘color‘:‘black‘},
#引用業務名稱為圖例項
‘name‘:‘=Sheet1!$A$‘+cur_row,

})

#數據域以第2~6行進行圖表數據系列函數調用
for row in range(2,7):
chart_series(str(row))

#設置X軸表格格式,本示例不啟用
#chart.set_table()
#設置圖表樣式,本示例不啟用
#chart.set_style(30)

#設置圖表大小
chart.set_size({‘width‘:577,‘height‘:287})
#設置圖表(上方)大標題
chart.set_title({‘name‘:u‘業務流量周報圖表‘})
#設置y軸(左側)小標題
chart.set_y_axis({‘name‘:‘Mb/s‘})

#在A8單元格插入圖表
worksheet.insert_chart(‘A8‘,chart)
#關閉Excel文檔
workbook.close()
</pre>
</pre>

##scapy庫
<pre>

</pre>

DevOpps python常用庫嘗鮮