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数目
方案二:
观察发现我的配置文件的结构类似于windows INI文件格式,于是尝试用configparser模块来解析
由于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数量
需要从一个配置文件中提取出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菜鸟升级路--自动化解析生成xml文件
- 菜鸟学Python(9):给文件添加内容
- Python处理MLDonkey 下载中文文件乱码问题
- Python模块之递归处理文件和文件夹
- 使用python 3.0 处理utf8格式的文件BOM问题
- Python 文件(file)处理 例子
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)
- Python recipe(9): 文件的逐词处理
- Python与文件搜索
- 使用DOS批处理搜索并处理某类文件
- Python学习笔记---模块;文件与文本处理
- Python处理MLDonkey 下载中文文件乱码问题 (2)
- 菜鸟学Python(9):给文件添加内容,得到文件信息
- 用Python遍历文件并搜索文件内容
- python笔记(十) - 异常和文件处理
- Python处理MLDonkey 下载中文文件乱码问题
- Python处理MLDonkey 下载中文文件乱码问题 (2)
- 菜鸟学Python(11):在Django中怎么下载任意类型的文件?
- Python处理日志之取得文件列表(更新)
- Python处理日志之取得文件列表(更新)