我有一个文件,我想阅读其中的特定部分。这是文件。
.......... .....管理服务器接口开始...............管理员服务器接口结束.......
我想读取"管理服务器接口"之间的文件部分,直到" admin Server接口结束"。我找到了一种在Perl中进行的方法,但找不到Python的方法。
在perl
中while (<INP>)
{
print $_ if(/^AdminServer interface definitions begins/ .. /^AdminServer interface definitions ends/);
}
可以提供帮助。
您可以通过行读取文件并收集标记之间的内容。
def dispatch(inputfile):
# if the separator lines must be included, set to True
need_separator = True
new = False
rec = []
with open(inputfile) as f:
for line in f:
if "Admin server interface begins" in line:
new = True
if need_separator:
rec = [line]
else:
rec = []
elif "Admin server interface ends" in line:
if need_separator:
rec.append(line)
new = False
# if you do not need to process further, uncomment the following line
#return ''.join(rec)
elif new:
rec.append(line)
return ''.join(rec)
即使输入文件不包含结尾分离器(Admin server interface ends
),上面的代码也将成功返回数据。如果要捕获此类文件,则可以修改带有条件的最后一个return
:
if new:
# handle the case where there is no end separator
print("Error in input file: no ending separator")
return ''
else:
return ''.join(rec)
如果文件不太大,并且您不关心内存消耗,则可以编写此简单解决方案:
from os.path import isfile
def collect_admin_server_interface_info(filename):
""" Collects admin server interface information from specified file. """
if isfile(filename):
contents = ''
with open(filename, 'r') as f:
contents = file.read()
beg_str = 'Admin server interface begins'
end_str = 'Admin server interface ends'
beg_index = contents.find(beg_str + len(beg_str))
end_index = contents.find(end_str)
if beg_index == -1 or end_index == -1:
raise("Admin server interface not found.")
return contents[beg_index : end_index]
else:
raise("File doesn't exist.")
此方法将尝试返回一个包含管理员服务器接口信息的单个字符串。