python菜鸟升级路--文件搜索和处理

45 篇文章 0 订阅

问题:

需要从一个配置文件中提取出case list,并计算case数量。

每行一个case,但是其中也有空白行和加了注释的无用行。

配置文件的注释方式有#,或者//。

配置文件的格式:

[DEFINE]
ABC_Server_IPAddr := "10.170.9.123"
[MODULE_PARAMETERS]
tsp_mgcLocalIPAddr := $ABC_Traffic_IPAddr
[TESTPORT_PARAMETERS]
system.RADIUS_PT.mode := "server"
[LOGGING]
LogFile := "./Logs/%e.%h-%n[%r].%s"
[EXTERNAL_COMMANDS]
//BeginTestCase := "./startTcpDump";
[EXECUTE]
Configure_ABC.tc_GET_AllMGCConfiguration
T_Test.case1

###T_Test.case2
//T_Test.case3
T_Test.case4

解决方案一:

编写了一个python脚本统计有效case总数

1.readlines函数读取文件里的所有内容,返回行列表

2.map(str.strip, lines)用来删除空白行

3.查找表示case列表的标识符[EXECUTE],并记录此行行号。然后跳出循环

4.保存case列表的内容,循环遍历每一行,不统计被注释的case

5.打印出总的有效case数目

#!/usr/bin/python
'''
calculate total effective case number
'''
with open('ABC_FT.cfg','rt') as f:
    lines = f.readlines()
    map(str.strip,lines)
    lineno = 0
    for line in lines:
        if '[EXECUTE]' in line:
            break
        else:
            lineno += 1

    content = lines[lineno:]
    casenum = 0
    for line in content:
        if line.startswith('#') or line.startswith('//'):
            continue
        else:
            casenum += 1

print('total effective case num is ',casenum)
脚本执行结果为 total effective case num is  3839,我的python版本是3.4.2.

方案二:

观察发现我的配置文件的结构类似于windows INI文件格式,于是尝试用configparser模块来解析

#!/usr/bin/python
import configparser
config = configparser.ConfigParser()
config.read('ABC_FT.cfg')
case_num = len(cofig.sections()['EXECUTE'])

由于configparser它会把配置文件里的参数解析成字典里的key和value。

由于我的配置文件中有很多配置项保存再更改,保存是以加注释的方式,configparser依然会解析注释行并报错提示有重复key值。

我的case列表不是以key-value的形式表现的,所以无法用configparser解析。

方案三:

写了四个个函数,比较之间的效率。

#!/usr/bin/python
'''
calculate total effective case number
'''
import time

def taketime(func):
    def wrapper(*args,**kwargs):        
        start = time.time()
        func(*args,**kwargs)
        end = time.time()
        return end-start
    return wrapper

def TotalCase2(file):
    with open(file) as f:
        lines = f.readlines()
        map(str.strip, lines)
        lineno = lines.index('[EXECUTE]\n')
        casenum = 0
        for line in lines[lineno:]:
            if line.startswith('#') or line.startswith('//'):
                continue
            else:
                casenum += 1
        return casenum

def TotalCase1(file):
    with open(file) as f:
        lines = f.readlines()
        map(str.strip, lines)
        lineno = 0
        for line in lines:
            if '[EXECUTE]' in line:
                break
            else:
                lineno += 1
        content = lines[lineno:]
        casenum = 0
        for line in content:
            if line.startswith('#') or line.startswith('//'):
                continue
            else:
                casenum += 1
        return casenum


def TotalCase3(filename):
    with open(filename) as f:
        lines = f.readlines()
        map(str.strip, lines)
        f.seek(0)
        for lineno,line in enumerate(f):
            if '[EXECUTE]' in line:
                break
        casenum = 0
        for line in lines[lineno:]:
            if line.startswith('#') or line.startswith('//'):
                continue
            else:
                casenum += 1
        return casenum
    
def TotalCase4(filename):
    with open(filename) as f:
        lines = f.readlines()
        map(str.strip, lines)
        case_index = lines.index('[EXECUTE]\n')
        casenum = len(list(case for case in lines[case_index:] if not (case.startswith('#') or case.startswith('//'))))                      
        return casenum

   
if __name__ == '__main__':
    filename = 'MGC_FT.cfg'
    print('Way1 ')    
    print('total effective case num is ',TotalCase1(filename))
    print('Elapse time is ',taketime(TotalCase1)(filename))
    print('Way2 ')    
    print('total effective case num is ',TotalCase2(filename))
    print('Elapse time is ',taketime(TotalCase2)(filename))    
    print('Way3 ')    
    print('total effective case num is ',TotalCase3(filename))
    print('Elapse time is ',taketime(TotalCase3)(filename))
    print('Way4 ') 
    print('total effective case num is ',TotalCase4(filename))
    print('Elapse time is ',taketime(TotalCase4)(filename))
            

这四种方法的差别很小,只是在个别地方有改进。

方法1的要点就是:

1.用readlines函数读文件,返回行列表

2.由于list是可迭代的,使用map函数,除去空白行 

3. 找出标识caselist的配置选项,记录行号 

4.除去被标记的case,只统计effective case数。

5.返回case数

方法2的改进点:

1.直接使用list的index方法查找caselist的配置选项,而不是用for循环

2.不需要重新创建列表content保存caselist,减少内存开销

方法3的不同点:

1.采用enumerate方法来找找caselist标记

方法4的改进点:

1.利用生成表达式(case for case in lines[case_index:] if not (case.startswith('#') or case.startswith('//'),减少内存开销

2. 在生成表达式里直接去有效case,省去了列表的复制。两个步骤并一步完成,缺点是代码变复杂了

3.可以将list改为set,可以去除重复case,只去有效的不重复case数量





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值