美文网首页我们的时代百年工匠
网络工程师的Python实例入门到放弃

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

作者: 爱看时事的通信崔 | 来源:发表于2020-03-05 17:56 被阅读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中处理时间的标准库,其中一些基本概念有

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

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

    相关文章

      网友评论

        本文标题:网络工程师的Python实例入门到放弃

        本文链接:https://www.haomeiwen.com/subject/quaqrhtx.html