学网络的很多同学对编程不感兴趣。其实编程并非遥不可及。网络工程师都知道的路由器和交换机的配置命令,那就是简单的编程。
现代网络的设备规模爆发式增长,对一个项目所有设备进行命令配置,往往需要耗费大量的时间和人力成本。那么有没有简单易用的自动化方法,能够实现一键配置呢?
我的答案是:对网络工程师来说,Python就是简单易用,能帮助我们实现想要的自动化,从而极大的提升劳动生产率的编程工具。本文中列出一些常用的Python脚本,让我们一起初步了解和学习Python吧。
一、Python语法简单
先举两个例子,让大家见识它简洁的语法
1.计算1到100的整数和
s = 0 # 定义一个和参数
for n in range(0,101): # n是从1每次加1,直到遍历到100,
s += n # 相当于s+n的和再赋值给s
print(s) # 打印结果 5050
2.温度转换实例代码
TempStr = input('输入带有符号的温度值:') # 例如20C或20F
if TempStr[-1] in ['F', 'f']:
# eval()函数:评估函数,去掉参数最外侧引号并执行余下语句的函数
C = (eval(TempStr[0:-1]) -32)/1.8 # 温度转换公式
print('转换后的温度:{:.2f}'.format(C))
if TempStr[-1] in ['C', 'c']:
F = 1.8*eval(TempStr[0:-1]) + 32 # 温度转换公式
print('转换后的温度:{:.2f}'.format(F))
else:
print('输入有误')
二、文件读写操作实例
- 日志文件分析工具代码
# log.txt
# a b 30 c
# e f 40 g
try:
# 打开文件错误,执行except
f = open('log.txt', 'r') # 以只读方式打开文件
avg = 0 # 平均值
cnt = 0 # 行数
for line in f: # 识别每行
ls = line.split() # 分割日志每行的数值
cnt += 1 # 行数加1
avg += eval(ls[2]) # 先求温度值之和
print('平均温度是:{:.2f}'.format(avg/cnt))
f.close() #关闭文件
except:
print('文件打开错误')
2.文件词语频次统计
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 # 找到某词,其对应的次数加1
for k in d:
print('{}出现{}次}'.format(k, d[k]))
三、常用库应用实例
- time库
time库是python中处理时间的标准库,其中一些基本概念有
- 计时起点:1970年1月1日0时0分0秒,time.gmtime(0)获得
- UTC时间:世界标准时间,与GMT一致
- DST时间:夏令时时间,源于系统底层C函数
- struct_time:python中用于保存时间对象、带有属性标签的数据类型
import time
# 时间获取
time.time() # 返回一个从计时起点开始的表示时间的浮点数,简单来说是时间戳1557990476.2949965
time.gmtime(s) # 返回一个struct_time,如果提供参数s(浮点数时间戳),把参数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表示的本地时间,如果提供参数s(浮点数),则把参数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转换成浮点数1557961821.0
time.asctime(t) # 返回一个字符串表示的时间,如果提供参数t(struct_time),则把参数变成字符串时间
'Thu May 16 15:11:47 2019'
time.ctime(s) # 返回一个字符串表示的时间,如果提供参数s(浮点数类型),则把参数变成字符串时间
'Thu May 16 15:11:51 2019'
2.random库
random库主要用于产生随机数
# import random
# 基本随机函数
random.seed(a =None) # 初始化给定的随机种子,默认为当前系统时间
random.random() # 生成一个[0.0, 1.0]之间的随机小数
random.getstate() # 返回随机数生成器的内部状态,元组类型
random.setstate(state) # 设计随机数生成器内部状态,该状态从getstate()函数获得
3.re库
正则表达式本质是简洁表达一组字符串的表达式
# 上述正则表达式代表病毒片段
# 任何文件可以表示为十六进制字符的组合形式
# 匹配:病毒引擎的扫描过程
import re, random, time
segma = '0123456789ABCDE' # 十六进制字母表
def genStr(): # 随机产生字符串
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]') # 编译正则表达式
count = 0 # 猜测次数
start = time.perf_counter() #计时功能
match = regex.search(genStr()) # 正则表达式查找
while not match:
count += 1
match = regex.search(genStr()) # 不停匹配
print('共扫描了{}个文件,匹配到{}-{}'.format(count, match.string, match.group(0))
end = time.perf_counter()
print('发现数据,共用时{:.5f}秒'.format(end -start))
4.os库的使用
实现基本的操作系统交互功能
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解释器相关的参数变量
import sys
sys.argv
# 命令行参数的列表,其中argv[0]表示执行程序本身
7.getopt库
getopt库提供解释命令行参数sys.argv的功能
import getopt, sys
try:
# -h -v -i <文件.ico> --dispath <目录> --clean
opts, args = getopt.getopt(sys.argv[1:], 'hi:v', ["dispath=", "clean"]) # 解析参数
for o, a in opts: # 如果是对应的命令参数则打印
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')
四、常用组合类型应用实例
- 集合(无序、非一致、无索引):可变集合(set)、不可变集合(frozenset)
- 序列(有序、非一致/一致、序号索引):元组、列表、字符串、字节串
- 字典(无序、非一致、自定义索引):字典
1.集合类型
- 可变集合set():集合元素的个数可以增加或减少
- 不可变集合frozenset():集合创建后不可改变
# 创建可变集合
A = {'P', 'Y', 123}
B = set('pypy123') # 七个字符构成七个元素
A-B # {123}
B-A # {'3', '2', '1'}
# 创建和表示不可变集合类型
A = frozenset("pypy123")
frozenset({'2','3','p','y','1'})
# frozenset()函数创建,表示为frozenset({})形式
2.序列类型
# 元组类型
# 创建后一般不能被修改的数据类型
# 逗号或()或tuple()函数创建
a = tuple('pypy123')
# ('p','y','p','y','1','2','3')
b = 123,456
# (123, 456)
# 列表类型
# 创建后可以随时被修改的序列类型
# []或list()函数创建
a = list('py123')
# ['p','y','1','2','3']
b = [123,456]
# [123,456]
# 字典类型
# {}或dict{}函数创建
# 空{}创建字典类型,而不是集合类型
d = {'CHINA':'beijing', 'AMERICA':'Wastinton', 'FRANCE':'Paris'}
# {'CHINA':'beijing', 'AMERICA':'Wastinton', 'FRANCE':'Paris'}
d['CHINA']
# 'beijing'
e = {}
type(e)
# {dict}
3.二维数据的表示与处理
二维数据的存储方式:
- 元数据(自定义数据)
- excel格式
- 数据库格式
- csv格式(从应用广泛性角度,csv格式好)任何数据管理软件都能导出csv文件
# 从CSV格式文件中读数据
fo = open(fname)
ls = []
for line in fo:
# 把每行形成的列表当作一个元素
line = line.replace('\n', '')
ls.append(line.split(','))
fo.close()
# 将数据写入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()
# 二维数据的逐一处理
采用二层循环
ls = [[],[],[]] # 二维列表
for row in ls:
for column in row:
print(column) #处理代码
上述实例只使用了Python面向过程的知识。其它还有面向对象、计算生态构建、多语言生态构建以及更加专业化的精深知识。
但我认为,以上已足够应付一般的自动化脚本编程需要。学习也可以先完成再完美,通过工作中的实际应用提起学习兴趣后,再深入研究,也未尝不可。
网友评论