學(xué)網(wǎng)絡(luò)的很多同學(xué)對編程不感興趣。其實編程并非遙不可及。網(wǎng)絡(luò)工程師都知道的路由器和交換機的配置命令,那就是簡單的編程。
現(xiàn)代網(wǎng)絡(luò)的設(shè)備規(guī)模爆發(fā)式增長,對一個項目所有設(shè)備進(jìn)行命令配置,往往需要耗費大量的時間和人力成本。那么有沒有簡單易用的自動化方法,能夠?qū)崿F(xiàn)一鍵配置呢?
我的答案是:對網(wǎng)絡(luò)工程師來說,Python就是簡單易用,能幫助我們實現(xiàn)想要的自動化,從而極大的提升勞動生產(chǎn)率的編程工具。本文中列出一些常用的Python腳本,讓我們一起初步了解和學(xué)習(xí)Python吧。
一、Python語法簡單
先舉兩個例子,讓大家見識它簡潔的語法
1.計算1到100的整數(shù)和
s = 0 # 定義一個和參數(shù)
for n in range(0,101): # n是從1每次加1,直到遍歷到100,
s += n # 相當(dāng)于s+n的和再賦值給s
print(s) # 打印結(jié)果 5050
2.溫度轉(zhuǎn)換實例代碼
TempStr = input('輸入帶有符號的溫度值:') # 例如20C或20F
if TempStr[-1] in ['F', 'f']:
# eval()函數(shù):評估函數(shù),去掉參數(shù)最外側(cè)引號并執(zhí)行余下語句的函數(shù)
C = (eval(TempStr[0:-1]) -32)/1.8 # 溫度轉(zhuǎn)換公式
print('轉(zhuǎn)換后的溫度:{:.2f}'.format(C))
if TempStr[-1] in ['C', 'c']:
F = 1.8*eval(TempStr[0:-1]) + 32 # 溫度轉(zhuǎn)換公式
print('轉(zhuǎn)換后的溫度:{:.2f}'.format(F))
else:
print('輸入有誤')
二、文件讀寫操作實例
- 日志文件分析工具代碼
# log.txt
# a b 30 c
# e f 40 g
try:
# 打開文件錯誤,執(zhí)行except
f = open('log.txt', 'r') # 以只讀方式打開文件
avg = 0 # 平均值
cnt = 0 # 行數(shù)
for line in f: # 識別每行
ls = line.split() # 分割日志每行的數(shù)值
cnt += 1 # 行數(shù)加1
avg += eval(ls[2]) # 先求溫度值之和
print('平均溫度是:{:.2f}'.format(avg/cnt))
f.close() #關(guān)閉文件
except:
print('文件打開錯誤')
2.文件詞語頻次統(tǒng)計
import jieba # 引入jieba庫
f = open('神雕俠侶.txt' ,'r', encoding='utf-8') # 打開神雕俠侶文件
txt = f.read() # 一次性讀出文件
f.close()
ls = jieba.lcut(txt) #分析文本保存到ls列表中
d = {} #定義一個字典變量
for w in ls:
d[w] = d.get(w,0) + 1 # 找到某詞,其對應(yīng)的次數(shù)加1
for k in d:
print('{}出現(xiàn){}次}'.format(k, d[k]))
三、常用庫應(yīng)用實例
- time庫
time庫是python中處理時間的標(biāo)準(zhǔn)庫,其中一些基本概念有
- 計時起點:1970年1月1日0時0分0秒,time.gmtime(0)獲得
- UTC時間:世界標(biāo)準(zhǔn)時間,與GMT一致
- DST時間:夏令時時間,源于系統(tǒng)底層C函數(shù)
- struct_time:python中用于保存時間對象、帶有屬性標(biāo)簽的數(shù)據(jù)類型
import time
# 時間獲取
time.time() # 返回一個從計時起點開始的表示時間的浮點數(shù),簡單來說是時間戳1557990476.2949965
time.gmtime(s) # 返回一個struct_time,如果提供參數(shù)s(浮點數(shù)時間戳),把參數(shù)s變成stuct_time
time.struct_time(tm_year=2020, tm_mon=5, tm_mday=16, tm_hour=7, tm_min=8, tm_sec=29, tm_wday=3, tm_yday=136, tm_isdst=0)
time.localtime(s) # 返回一個struct_time表示的本地時間,如果提供參數(shù)s(浮點數(shù)),則把參數(shù)s變成本地時間
time.struct_time(tm_year=2020, tm_mon=5, tm_mday=16, tm_hour=15, tm_min=10, tm_sec=11, tm_wday=3, tm_yday=136, tm_isdst=0)
time.mktime(time.gmtime()) # mktime把struct_time轉(zhuǎn)換成浮點數(shù)1557961821.0
time.asctime(t) # 返回一個字符串表示的時間,如果提供參數(shù)t(struct_time),則把參數(shù)變成字符串時間
'Thu May 16 15:11:47 2019'
time.ctime(s) # 返回一個字符串表示的時間,如果提供參數(shù)s(浮點數(shù)類型),則把參數(shù)變成字符串時間
'Thu May 16 15:11:51 2019'
2.random庫
random庫主要用于產(chǎn)生隨機數(shù)
# import random
# 基本隨機函數(shù)
random.seed(a =None) # 初始化給定的隨機種子,默認(rèn)為當(dāng)前系統(tǒng)時間
random.random() # 生成一個[0.0, 1.0]之間的隨機小數(shù)
random.getstate() # 返回隨機數(shù)生成器的內(nèi)部狀態(tài),元組類型
random.setstate(state) # 設(shè)計隨機數(shù)生成器內(nèi)部狀態(tài),該狀態(tài)從getstate()函數(shù)獲得
3.re庫
正則表達(dá)式本質(zhì)是簡潔表達(dá)一組字符串的表達(dá)式
# 上述正則表達(dá)式代表病毒片段
# 任何文件可以表示為十六進(jìn)制字符的組合形式
# 匹配:病毒引擎的掃描過程
import re, random, time
segma = '0123456789ABCDE' # 十六進(jìn)制字母表
def genStr(): # 隨機產(chǎn)生字符串
s = ''
global segma # 全局聲明
for i in range(32): # 逐一生成隨機字符
s += segma[random.randint(0,15)]
return s
regex = re.compile(r'[1-2][^2-8][D-F]0+[A-F]') # 編譯正則表達(dá)式
count = 0 # 猜測次數(shù)
start = time.perf_counter() #計時功能
match = regex.search(genStr()) # 正則表達(dá)式查找
while not match:
count += 1
match = regex.search(genStr()) # 不停匹配
print('共掃描了{(lán)}個文件,匹配到{}-{}'.format(count, match.string, match.group(0))
end = time.perf_counter()
print('發(fā)現(xiàn)數(shù)據(jù),共用時{:.5f}秒'.format(end -start))
4.os庫的使用
實現(xiàn)基本的操作系統(tǒng)交互功能
import os
os.system("c:\\windows\system32\calc.exe") # 運行計算器程序
0 # 命令啟動的返回值為0
5.filecmp庫的使用
提供比較目錄和文件的功能
import filecmp
filecmp.cmpfiles('d:\\app', 'e:\\app', ['abc', 'def/abc'])
# 比較d:\\app\\abc和e:\\app\abc d:\\app\\def\\abc和e:\\app\def\\abc
6.sys庫
維護一些與python解釋器相關(guān)的參數(shù)變量
import sys
sys.argv
# 命令行參數(shù)的列表,其中argv[0]表示執(zhí)行程序本身
7.getopt庫
getopt庫提供解釋命令行參數(shù)sys.argv的功能
import getopt, sys
try:
# -h -v -i <文件.ico> --dispath <目錄> --clean
opts, args = getopt.getopt(sys.argv[1:], 'hi:v', ["dispath=", "clean"]) # 解析參數(shù)
for o, a in opts: # 如果是對應(yīng)的命令參數(shù)則打印
if o == '-h':
print('find -h')
elif o == '-v':
print('find -v')
elif o == '-i':
print('find -i {}'.format(a))
elif o == '--dispath':
print('find --dispath {}'.format(a))
elif o == '--clean':
print('find --clean')
else:
print('unknown value')
except getopt.GetoptError:
print('value to error')
四、常用組合類型應(yīng)用實例
- 集合(無序、非一致、無索引):可變集合(set)、不可變集合(frozenset)
- 序列(有序、非一致/一致、序號索引):元組、列表、字符串、字節(jié)串
- 字典(無序、非一致、自定義索引):字典
1.集合類型
- 可變集合set():集合元素的個數(shù)可以增加或減少
- 不可變集合frozenset():集合創(chuàng)建后不可改變
# 創(chuàng)建可變集合
A = {'P', 'Y', 123}
B = set('pypy123') # 七個字符構(gòu)成七個元素
A-B # {123}
B-A # {'3', '2', '1'}
# 創(chuàng)建和表示不可變集合類型
A = frozenset("pypy123")
frozenset({'2','3','p','y','1'})
# frozenset()函數(shù)創(chuàng)建,表示為frozenset({})形式
2.序列類型
# 元組類型
# 創(chuàng)建后一般不能被修改的數(shù)據(jù)類型
# 逗號或()或tuple()函數(shù)創(chuàng)建
a = tuple('pypy123')
# ('p','y','p','y','1','2','3')
b = 123,456
# (123, 456)
# 列表類型
# 創(chuàng)建后可以隨時被修改的序列類型
# []或list()函數(shù)創(chuàng)建
a = list('py123')
# ['p','y','1','2','3']
b = [123,456]
# [123,456]
# 字典類型
# {}或dict{}函數(shù)創(chuàng)建
# 空{(diào)}創(chuàng)建字典類型,而不是集合類型
d = {'CHINA':'beijing', 'AMERICA':'Wastinton', 'FRANCE':'Paris'}
# {'CHINA':'beijing', 'AMERICA':'Wastinton', 'FRANCE':'Paris'}
d['CHINA']
# 'beijing'
e = {}
type(e)
# {dict}
3.二維數(shù)據(jù)的表示與處理
二維數(shù)據(jù)的存儲方式:
- 元數(shù)據(jù)(自定義數(shù)據(jù))
- excel格式
- 數(shù)據(jù)庫格式
- csv格式(從應(yīng)用廣泛性角度,csv格式好)任何數(shù)據(jù)管理軟件都能導(dǎo)出csv文件
# 從CSV格式文件中讀數(shù)據(jù)
fo = open(fname)
ls = []
for line in fo:
# 把每行形成的列表當(dāng)作一個元素
line = line.replace('\n', '')
ls.append(line.split(','))
fo.close()
# 將數(shù)據(jù)寫入csv格式的文件
ls = [[1,2,3],[2,3,4],[3,4,5]] # 二維列表
f = open(fname, 'w')
for item in ls:
f.write(','.join(item) + '\n') # 將每個列表元素本身寫入csv一行中
f.close()
# 二維數(shù)據(jù)的逐一處理
采用二層循環(huán)
ls = [[],[],[]] # 二維列表
for row in ls:
for column in row:
print(column) #處理代碼
上述實例只使用了Python面向過程的知識。其它還有面向?qū)ο?、計算生態(tài)構(gòu)建、多語言生態(tài)構(gòu)建以及更加專業(yè)化的精深知識。
但我認(rèn)為,以上已足夠應(yīng)付一般的自動化腳本編程需要。學(xué)習(xí)也可以先完成再完美,通過工作中的實際應(yīng)用提起學(xué)習(xí)興趣后,再深入研究,也未嘗不可。