您的位置:首页 > 编程语言 > Python开发

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

2016-09-19 17:32 399 查看
问题:

需要从一个配置文件中提取出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数量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 文件处理