我们的时代百年工匠

网络工程师的Python实例入门到放弃

2020-03-05  本文已影响0人  爱看时事的通信崔

学网络的很多同学对编程不感兴趣。其实编程并非遥不可及。网络工程师都知道的路由器和交换机的配置命令,那就是简单的编程。

现代网络的设备规模爆发式增长,对一个项目所有设备进行命令配置,往往需要耗费大量的时间和人力成本。那么有没有简单易用的自动化方法,能够实现一键配置呢?

我的答案是:对网络工程师来说,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('输入有误')

二、文件读写操作实例

  1. 日志文件分析工具代码
# 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]))

三、常用库应用实例

  1. time库

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')

四、常用组合类型应用实例

1.集合类型

# 创建可变集合
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.二维数据的表示与处理

二维数据的存储方式:

# 从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面向过程的知识。其它还有面向对象、计算生态构建、多语言生态构建以及更加专业化的精深知识。

但我认为,以上已足够应付一般的自动化脚本编程需要。学习也可以先完成再完美,通过工作中的实际应用提起学习兴趣后,再深入研究,也未尝不可。

上一篇下一篇

猜你喜欢

热点阅读