我真的不相信通用文本文件解析器 - 尤其是那些文件是为人类读者而设计的。像HTML和网络日志这样的文件可以通过美丽的肥皂或正则表达式很好地处理。但人类可读的文本文件仍然是一个棘手的问题。设计一个模块来解析文本文件
只是我愿意手动编码一个文本文件解析器,剪裁我遇到的每种不同的格式。我仍然想看看是否有可能有一个更好的程序结构,使我能够在3个月的时间内了解程序逻辑。也为了让它可读。
今天,我得到了一个问题,从文件中提取时间戳:
"As of 12:30:45, ..."
"Between 1:12:00 and 3:10:45, ..."
"During this time from 3:44:50 to 4:20:55 we have ..."
解析很简单。我在每一行的不同位置都有时间戳。但我认为应该如何设计模块/功能,方式如下:(1)每行格式将单独处理,(2)如何分支到相关功能。例如,我可以像下面每一行代码分析器:
def parse_as(s):
return s.split(' ')[2], s.split(' ')[2] # returning the second same as the first for the case that only one time stamp is found
def parse_between(s):
return s.split(' ')[2], s.split(' ')[4]
def parse_during(s):
return s.split(' ')[4], s.split(' ')[6]
这可以帮助我有关于已经由程序处理的格式,快速的想法。如果我遇到另一种新格式,我总是可以添加一个新功能。
但是,我仍然没有一个优雅的方式来分支到相关的功能。
# open file
for l in f.readline():
s = l.split(' ')
if s == 'As':
ts1, ts2 = parse_as(l)
else:
if s == 'Between':
ts1, ts2 = parse_between(l)
else:
if s == 'During':
ts1, ts2 = parse_during(l)
else:
print 'error!'
# process ts1 and ts2
这不是我想要维护的东西。
有什么建议吗?曾经有人认为装饰者可能会帮助我,但我无法自己把它整理出来。感谢任何人都可以指出我正确的方向。
决定一组选择的短语意味着寻找字典可以为你做些什么。你也可能想让你的检查案例无所谓。对于Python本人来说,这是一个相当新的东西,你是不是应该写'if'作为“in s:'here? – usr2564301